Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního
… více »Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.
Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.
KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.
Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.
Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).
Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.
Dle plánu byla vydána Opera GX pro Linux. Ke stažení je .deb i .rpm. V plánu je flatpak. Opera GX je webový prohlížeč zaměřený na hráče počítačových her.
GNUnet (Wikipedie) byl vydán v nové major verzi 0.27.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.
Byly publikovány informace (technické detaily) o bezpečnostním problému Snapu. Jedná se o CVE-2026-3888. Neprivilegovaný lokální uživatel může s využitím snap-confine a systemd-tmpfiles získat práva roota.
Ne, nebojte se s mou nesnášenlivostí to není tak horké. Jen mám rád miblog 
Každý program obsahuje alespoň jednu chybu. A každý program v C++ obsahuje alespoň jednu zradu.
Po letech něco dělám v C++ a v podstatě poprvé pořádně používám STL (za časů Borland C++ Builderu 3 používat STL fakt nešlo). Žil jsem v bláhové představě, že kontejnerové šablony představují bezpečnou alternativu ke konstrukcím z plain C, kterým assembler přímo kouká z očí. Bezpečností mám na mysli to, že každá operace se buď korektně provede nebo se vyvolá výjimka. Ó mé bláhové já, jak můžeš být tak bláhové?
Kupříkladu tento program
#include <vector>
int main()
{
std::vector<int> v(1);
int foo = v[1000000000];
}
žádnou výjimku nevyvolá. Normálně spadne na segmentation fault. Proč? Protože přetížený operátor indexování ([]) nekontroluje meze. Správné je použít metodu at(int). Následující kód
#include <vector>
int main()
{
std::vector<int> v(1);
int foo = v.at(1000000000);
}
už padne hezky kultivovaně na výjimce. Myslím si, že by bylo lepší nechat operátor [] pro běžné použití a kontrolovat ho a mít speciální metodu at(int) pro nějaké úchylné časově kritické úseky. Jenže STL má vlastní hlavu. K čemu je mi krásný přetížený operátor, který nemůžu používat?
Tiskni
Sdílej:
Boze, boze...
Pretizeni operatoru [] je udelano takto kvuli tomu, ze std::vector ma modelovat plain pole z C. V C se [] nekontroluje, takze to same je i v STL. Kazdy to vi (a nebo to ma vedet), a proto pokud mu nezalezi na rychlosti, pouziva at, pokud naopak pozaduje maximalni vykon, ma tu [].
To mate z toho, ze nectete dokumentaci.
at(), která kontrolu provádí. Nevidím na tom nic nelogického.
for (unsigned i = myVector.size() -1; i <= 0; i--)
{
}
Selže, protože přeteče unsigned, když je kontejner prázdný. A které pako tam dalo unsigned? No já, protože
for (int i = 0; i < myVector.size(); i++)hází warning na porovnávání znamínkových a neznamínkových typů, pač size() vrací unsigned. No a když pak náhodou chci předělat pořadí, chyba je na světě.
uint i;
uint count = myVector.size();
for (i = count - 1; i != uint(-1); i--) {}
for (i = 0; i != count; i++) {}
for (uint i = count - 1; i != uint(-1); i--) {}
Nezlobte se na mě, ale tohle považuji za hackerství. Triky nebrat.
var
I: Word;
begin
for I := Count - 1 downto 0 do
begin
{ něco }
end;
end;
char array[100];
uint i;
uint count = sizeof(array) / sizeof(array[0]);
for (i = 0; i != count; i++) {
if (i < count) array[i] ... neco;
}
neznamenkove by to mohlo vypadat treba takto:
char array[100];
int i;
int count = sizeof(array) / sizeof(array[0]);
for (i = 0; i != count; i++) {
if (i >= 0 && i < count) array[i] ... neco;
}
typedef vector<int> vector_t;
typedef vector_t::size_type vec_size;
vector_t vec;
...
..
vec_size count = vec.size();
...
..
Jinak nemam pochopeni pro autora blogu. Necetl jste dokumentaci a navic si stezujete. K tomu jsem taky nachylny. Je lepsi pred zapisem do blogu hledat problem mezi zidli a klavesnici:)
std::vector<int> x;
// ....
int c = x.size();
int* t = &x[c-1];
for(int i = c; i; i--, t--) {
printf("%d\n", *t);
}
... a jede to krasne bez zbytecnejch kontrol, bez varovani a bez chyb...
PS: pokud nekdo propaguje kontrolu mezi poli, tak by mel zemrit na mucidlech
Nemyslim si, ze to je to pravy vorechovy. Co kdyz bude nahodou, ale jenom nahodou vektor prazdny. Navic popirate to, k cemu kontejnery slouzi: typ prvku uz znate. Ve vasem pripade bude kdokoliv muset prohlizet cely kod, aby ho updatoval. Konverzi velikosti kontejneru na int muzeme prijit k urazu. Ale jak pisete, asi vam to vzdycky projde:/
vector_t::iterator first = vec.begin();
const vector_t::iterator last = vec.end();
while(first != last)
cout << *first++ << endl;
t bude neplatny ukazatel. To ale nevadi, protoze se stejne nepouzije...
> Konverzi velikosti kontejneru na int muzeme prijit k urazu.
To jako kdyby v nem bylo vic nez 2**31 polozek ????
> Ale jak pisete, asi vam to vzdycky projde:/
jj. a sem presvedcenej, ze muj zpusob je rychlejsi...
Tak mi trochu pomozte. Rikate, neplatny ukazatel nevadi, resp. kdyz
int c = x.size(); int* t = &x[c-1];c bude 0, tak volani &x[-1] asi nevyjde nebo ano? > Konverzi velikosti kontejneru na int muzeme prijit k urazu.
Z principu. Proc proste nepouzit vector<int>::size_type, ktery se pouziva i pri kontrole mezi u at()?
t = &x[-1] vyjde. Prvek se totiz necte, jen se zjisti jeho ukazatel. Klidne to vyzkousej. samozrejme nesmis pouzit *t ...
> Z principu. Proc proste nepouzit vector<int>::size_type, ktery se pouziva i pri kontrole mezi u at()?
nechapu kde je problem. A abych se priznal tak moc nemam rad tyhle typy jako size_t, size_type a tak podobne. Proc proste nepouzit int?
int & operator [] (int index) {
return pole[index];
}
pokud neni ve vektoru zadnej prvek, tak pole je pravdepodobne NULL. To ale nevadi, protoze navratovej typ funkce je int &. Takze se z pole nic necte, ale vrati se adresa pole + index. V nasem pripade 0 - sizeof(int) , coz je sice neplatna adresa, ale nicemu to nevadi, protoze ji stejne nepouzijem...
Nac tak slozite, tohle je priklad na jednu radku:
std::copy(x.begin(), x.end(), std::ostream_iterator<int>(std::cout, "\n"));
-O3 a nekdo muze zkusit jeste -funroll-loops nebo -funroll-all-loops
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long long uint64;
typedef unsigned int uint;
static __inline__ uint64 rdtsc(void)
{
uint64 x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
#define SIZE (1024*16)
#define OUTER_LOOP_SIZE (1024*256)
/*
* Benchmark optimalizace smycky
*/
int main(int argc, char *argv[])
{
uint tmp = 0;
uint a;
uint x;
char *str = (char *)malloc(SIZE);
char *ptr;
uint64 t;
if (!str) return EXIT_FAILURE;
t = rdtsc();
for (a = OUTER_LOOP_SIZE; a; a--) /* Velky cyklus, neni co optimalizovat */
{
/* maly cyklus, uvidime */
ptr = str;
for (x = 0; x != SIZE; x++) {
tmp += ptr[x];
}
}
t = rdtsc() - t;
printf("Test pro pristup pres index pole: %llu cycles\n", t);
t = rdtsc();
for (a = OUTER_LOOP_SIZE; a; a--) /* Velky cyklus, neni co optimalizovat */
{
/* maly cyklus, uvidime */
ptr = str;
for (x = 0; x != SIZE; x++) {
tmp += *ptr++;
}
}
t = rdtsc() - t;
printf("Test pro pristup pres pointery: %llu cycles\n", t);
printf("\n\nVypiseme tmp, protoze kompiler by mohl smycky vypustit %u\n", tmp);
free(str);
return EXIT_SUCCESS;
}
Korektnost programu je pro mě důležitější než pár instrukcí navíc.
Pokud pozadujete kontrolu, tak pouzivejte at - jak proste :).
Já bych operátor [] udělal tak, aby emuloval _funkčnost_ jeho obdoby z plain C, ne nutně i jeho nedostatky.
Nic vam nebrani v tom, abyste si s vyuzitim standardniho vytvoril vlastni, patricne upraveny kontejner.
Predstavte si, ze existuji exoti, kteri to nepovazuji za nedostatek, ale za vyhodu.
Třeba tu.
This method is public as an implementation side effect. do not call or override.
) Ok, nahodím udičku. Já mám verzi STL, která nejenže všechno hlídá a vyhazuje výjimky, ale kontroluje skutečně každou blbost. Takže přístup mimo rozsah pole u vectoru? Okamžitě výjimka. Použiji neplatný iterátor, je výjimka. Použiji iterátor na jiný objekt, než je platné, a šup výjimka. Já si na své STL nestěžuju...
Já asi napíšu zápis Miluju C++, protože C++ je jazyk, který považuji za nejlepší staticky typovaný kompilovaný jazyk, se kterým jsem se kdy setkal.
Já asi napíšu zápis Miluju C++, protože C++ je jazyk, který považuji za nejlepší staticky typovaný kompilovaný jazyk, se kterým jsem se kdy setkal.Neviem, či toto mal byť vtip, ale ak nie, tak si pozri haskell. Je to najlepší staticky typovaný kompilovaný jazyk, s ktorým som sa stretol
Reseni neni hledat tu spravnou implementaci, kde to delaji, tak "jak to vyhovuje memu zpusobu programovani". Co prenositelnost? Ale precist si dokumentaci. Chovani [] pri prekroceni mezi neni definovane. Tzn. ze kontrola muze byt provadena, ale nemusi.
Ze standardu je to proste nedefinovane, a tak by se mel clovek k tomu postavit.