Portál AbcLinuxu, 26. listopadu 2025 10:24
using namespace std;
int main()
{
int n = 7;
int *slova2 = new int[n];
slova2[0] += 23;
slova2[0] += 32;
cout << slova2[0] << endl;
return 0;
}
na vystupu vyhodi pokazde random cislo? Treba tohle: 6230608
Řešení dotazu:
main() operátorem +=.
Premenne v C su defaultne neinicialovane
Jen pro pořádek: tohle není C. Takže přesnější vysvětlení je, že typ int nemá defaultní konstruktor, který by hodnotu inicializoval.
Premenne v C su defaultne neinicialovane
A pro úplnost: tohle ani není obecně pravda.
A pro úplnost:
V C jsou static a „globální“ proměnné inicializované (zjednodušeně na 0).
Nic než souhlas(, nesouhlasil bych s „povinnou“ inicializací při deklaraci ;)).
Přemýšlet nad tím jinak v C(/C++) je vždy kravina, bo tam je to nebo to(, ne ‚a‘), a „auto inicializace“ v těchto specifických případech je tam tak nějak z pohledu programátora navíc.
static int i = 0;je to samé(, nebo by mělo být) co
static int i;bo „auto inicializace“ se děje jen v 2. případě.
static int i; i = 0;už může být incicializace (bez optimalizace) 2×.
static int i;Tohle tu proměnnou vytvoří vynulovanou při startu programu a pak už s ní nic nedělá.
static int i = 0;Tohle tu proměnnou nastaví ještě jednou při inicializaci statických proměnných v dané kompilační jednotce. Tedy pokud jiná statická inicializace z jiné kompilační jednotky tu hodnotu změní, tohle ji může a nemusí přepsat (protože pořadí statických inicializací mezi kompilačními jednotkami není definované). To první se využívá u nifty counteru.
Tedy pokud jiná statická inicializace z jiné kompilační jednotky tu hodnotu změní
Ta proměnná je static, takže ji z jiné kompilační jednotky z definice přepsat nemůžete.
Jak?
Jsem přesvědčen, že ty zápisy jsou identické a gcc generuje identický kód.
__attribute__((constructor))).
Ale aby to nebylo tak snadné, tak konstantová inicializace se provádí jen compile-time konstantami, tj. literály či constexpry, nikoliv const proměnnými. Ten problém, co jsem měl, byl právě použití constu k inicializaci na 0 (v pre-C++11 jsem měl nullptr nadefinovaný jako const).
static se má dít v jednom kroku a buď se inicializuje na „0“, nebo na hodnotu, která je při deklaraci explicitně uvedena a const tam nehraje žádnou roli.
// inicializace promměných i=0; ... // konec inicializacepo kterém vím, že všechny proměnné musí mít hodnotu. A jak jsem říkal, ten řádek kódu navíc mi nevadil ani v dobách Fortranu, děrných štíků a mainframu s 256 kB operační paměti, natož dnes.
static a, tak máš inicializace dvě, jedna při deklaraci a druhá při tvé inicializaci. Asi to v 99% případech nevadí, ale já když to vím, tak mě to žere…
To máš pravdu. Je to síla zvyku. Ale to víš, FORTRANský programátor může psát aritmetické IF v jakémkoliv jazyce.
(A odkaz pro ty, co neví, co je artimetické IF)
Mám pocit, že moc věříš optimalizaci, která by, dle mého, mohla být nad rámec povoleného.
Zatímco s
static int j = 0; a static int j; gcc generuje identický kód, s static j; j = 0; již jiný/delší (nenamáhám se to disasemblovat, stačí fstat a md5sum).
Zkus si:
//use: gcc -O3 test.c -o test && md5sum ./test
//cygwin use: gcc -O3 test.c -o test.exe && md5sum ./test
#include <stdio.h>
#include <limits.h>
int main(){
int iii = INT_MAX;
/* 1. --- explicit --- */
static int i = 0;
/* ---------------- */
/* 2. --- implicit --- */
//static int i;
/* ---------------- */
/* 3. ---- twice ---- */
//static int i;
//i = 1;
/* ---------------- */
printf("%d",iii - i);
return 0;
}
O tom ze 3. je jine nez 1. a 2. snad nepochybuje…No a o tom to právě je, že jsou tam ty dvě inicializace, které nemohou/by neměly být při kompilaci optimalizovány, i když by to v tomto případě, nemělo žádný faktický dopad.
Myslim, ze predrecnici se bavili o optimalizaci v pripade nestatickych lokalnich promennych.Co to?, mně přijde, že se bavíme o
static od začátku, a pak píšu právě o static a na to je reakce o podcenění optimalizace.
PS: Ad. pochyby o smyslu, on ten příklad nedává smysl ani jako celek, to je častý úděl moc krátkých příkladů. Tak si představ, že je tam nějaké if a fce se volá opakovaně.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.