Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 20. srpen 2013, 18:04:57 Předmět: |
|
|
VODA napsal: |
Obvykle se to nenuluje, což vychází z assembleru. |
No existuje spousta možností, jak tu paměť nulovat tak, aby to nebylo z assembleru vidět, ale já neříkám, že se to soustavně vždy nuluje, jen si myslím, že když naalokuješ paměť, tak je prostě dost často nulová.
Tak jsem to kvůli tobě otestoval. Platforma je Gentoo GNU/Linux.
program:
kód: |
#include <iostream>
using namespace std;
int main()
{
{
cout << "--------------------STATIC ALLOCATION--------------------" << endl;
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
cout << g << endl;
cout << h << endl;
cout << i << endl;
cout << j << endl;
cout << k << endl;
cout << l << endl;
cout << m << endl;
cout << n << endl;
cout << o << endl;
cout << p << endl;
cout << q << endl;
cout << r << endl;
}
{
cout << "--------------------DYNAMIC ALLOCATION--------------------" << endl;
int * a = new int;
int * b = new int;
int * c = new int;
int * d = new int;
int * e = new int;
int * f = new int;
int * g = new int;
int * h = new int;
int * i = new int;
int * j = new int;
int * k = new int;
int * l = new int;
int * m = new int;
int * n = new int;
int * o = new int;
int * p = new int;
int * q = new int;
int * r = new int;
cout << (*a) << endl;
cout << (*b) << endl;
cout << (*c) << endl;
cout << (*d) << endl;
cout << (*e) << endl;
cout << (*f) << endl;
cout << (*g) << endl;
cout << (*h) << endl;
cout << (*i) << endl;
cout << (*j) << endl;
cout << (*k) << endl;
cout << (*l) << endl;
cout << (*m) << endl;
cout << (*n) << endl;
cout << (*o) << endl;
cout << (*p) << endl;
cout << (*q) << endl;
cout << (*r) << endl;
}
}
|
překlad:
výstup:
kód: |
--------------------STATIC ALLOCATION--------------------
0
0
32767
320187552
0
4196480
0
4198256
0
0
0
1
0
4198349
0
2
0
4198250
--------------------DYNAMIC ALLOCATION--------------------
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
|
Jak je to na Win nebo na VS nevím, ale VS to fakt možná nuluje. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 20. srpen 2013, 18:19:14 Předmět: |
|
|
Pokud se to udělá takhle:
kód: |
int *array = new int[50]; |
může být v paměti bordel
ALE takhle
kód: |
int *array = new int[50](); |
to vynuluje _________________ Perry.cz |
|
Návrat nahoru |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 20. srpen 2013, 18:26:47 Předmět: |
|
|
perry napsal: |
ALE takhle
kód: |
int *array = new int[50](); |
to vynuluje |
Jasný, zavolá to totiž konstruktor, že? To jsou ale kouzla . |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 20. srpen 2013, 18:29:55 Předmět: |
|
|
citace: |
TeaTime
Jasný, zavolá to totiž konstruktor, že? To jsou ale kouzla Shocked .
|
No.. jasný to je ale nikdy jsem to nepoužil a ani moc často neviděl _________________ Perry.cz |
|
Návrat nahoru |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 20. srpen 2013, 20:33:51 Předmět: |
|
|
Není to ovlivněno debug/release?
Mám pocit, že VS v debug módu nuluje a v release ne. |
|
Návrat nahoru |
|
|
Tringi
Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 20. srpen 2013, 21:27:50 Předmět: |
|
|
A pak tady máte takové MinGW a Cygwin, které vnáší mix mezi linuxovou sémantikou a Visual Studia v tomto ohledu. Resp. MinGW takový debug režim, kdy by přednulovával stack-framy, nemá.
Standard C++ garantuje, že automaticky vynulované budou pouze statické (uvnitř funkcí), thread-local a, možná překvapivě (a občas kompilátory implementováno špatně), globální proměnné; stack ne.
To, že Windows (a vlastně každý OS, který slibuje trochu normální zabezpečení) přiřazuje procesům nové stránky vždy vynulované, nebrání zavaděči vláken použít pro stack takové, které už od VM má, popsané, případně že funkce vstoupí (nejčastější případ) na stack, kde už před ní nějaká funkce byla, a tu paměť k něčemu používala. _________________ WWW | GitHub | TW
Naposledy upravil Tringi dne 20. srpen 2013, 21:29:39, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 20. srpen 2013, 21:29:16 Předmět: |
|
|
no new A(); vs new A; je setsakra okrajovy problem pricom zalezi ci kompulujete ako C++98 alebo C++03 http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new
tyka sa to ale iba Plain Old Data, teda primityvnych typov a struct/class bez konstruktora, destruktora alebo virtualnych metod.
mam pre vas jednu chutovku
kód: |
class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };
A *a = new C;
delete a;//crash
|
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 20. srpen 2013, 22:05:51 Předmět: |
|
|
No tak to je zajímavé. Já jsem zvyklý nepoužívat závorky u konstruktoru new a doteď jsem si myslel, že je to ekvivalentní zápis... toto je pro mě novinka (nejsem standard nazi).
Díky (nicméně počítat s tím nikdy nebudu
Na multiple inheritance mám svůj názor (=prasárna), buď se to používá pro slepení unrelated tříd nebo to používají Javisti (nebo C# kluci), co si myslí, že interfacy jsou c00l.
Mimochodem kontrolní otázka: pointer to member v MSC má konstantní (jak si přeje standard) nebo dynamickou velikost?
Btw. je pravda, že dynamic cast je brutálně neoptimální? (jsem líný otestovat) Žil jsem doteď v omylu, že pro classu porovná s class deskriptorem (=pointer někam), ale prý se tam u některých překladačů porovnávají stringy (FUJ!).
Mě to tedy netrápí, mám vlastní obdobu RTTI se striktní single inheritance,
což mi umožnuje spawnování podle názvu třídy a serializaci členských proměnných... |
|
Návrat nahoru |
|
|
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 20. srpen 2013, 22:15:30 Předmět: |
|
|
mar napsal: |
Na multiple inheritance mám svůj názor (=prasárna), buď se to používá pro slepení unrelated tříd nebo to používají Javisti (nebo C# kluci), co si myslí, že interfacy jsou c00l. |
C# nemá multiple inheritance, resp ne na třídy. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 20. srpen 2013, 22:21:28 Předmět: |
|
|
satik napsal: |
C# nemá multiple inheritance. |
A co jsou interfacy potom?
EDIT: obecně si myslím, že algoritmická kvalita je mnohdy důležitější, než fancy prasárny toho či onoho jazyka proto, že si někdo myslí, že je to velmi cool.
Mám rád jednoduché věci, i když ne vždy se mi to úplně daří.
(=vždycky radši použiji high level algoritmus s nižší časovou složitostí, než se babrat v low level nesmyslech) |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 21. srpen 2013, 00:57:26 Předmět: |
|
|
citace: |
Mám rád jednoduché věci, i když ne vždy se mi to úplně daří.
(=vždycky radši použiji high level algoritmus s nižší časovou složitostí, než se babrat v low level nesmyslech) |
High level algoritmus s nižší časovou složitostí než co? Jestli než low level "nesmysly" tak mi uveď nějaký příklad, chtěl bych ho vidět. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 21. srpen 2013, 08:08:48 Předmět: |
|
|
Asi jsem špatně vyjádřil. Pokud mám někde např. O(n^2), kde n je docela vysoké (a můžu mít třeba n*log n), tak asi logicky nezačnu s low level optimalizacemi, abych to zrychlil (protože to mě nevytrhne, i kdybych to řekněme zrychlil 4x). |
|
Návrat nahoru |
|
|
vitamin
Založen: 31. 07. 2013 Příspěvky: 7
|
Zaslal: 21. srpen 2013, 09:30:03 Předmět: |
|
|
mar napsal: |
...
Btw. je pravda, že dynamic cast je brutálně neoptimální? (jsem líný otestovat) Žil jsem doteď v omylu, že pro classu porovná s class deskriptorem (=pointer někam), ale prý se tam u některých překladačů porovnávají stringy (FUJ!).
Mě to tedy netrápí, mám vlastní obdobu RTTI se striktní single inheritance,
což mi umožnuje spawnování podle názvu třídy a serializaci členských proměnných...
|
Ak mas extremne zastarali prekladac tak sa mozu porovnavat stringy. Standart nepise ako sa ma implementovat dynamic_cast, ale vecsina prekladacov to ma tak ze tabulka virtualnych metod obsahuje pointer na data obsahujuce RTTI. Dynamic_cast je ale aj tak pomaly, testuje nullptr, obsahuje viacej dereferenovani, vola specialnu funkciu ktora testuje hiearchiu objektov...
Ked uz treba casto pouzivat dynamic_cast tak je dobre si implementovat vlastnu verziu. Ja pouzivam isa/classof/dyn_cast z llvm (Tiez len so single inheritance)
nou napsal: |
...
mam pre vas jednu chutovku
kód: |
class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };
A *a = new C;
delete a;//crash
|
|
Mne to v pohode funguje (az na to ze sa nevola destructor ~C a ~B kvoly absencii vptr v A) |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 21. srpen 2013, 09:49:42 Předmět: |
|
|
valgrind je fajn ale na tohle je snazsi pridat kompilatoru -g a spustit pod gdb (gdb --args ./muj-program args) a pri padu se podivat na backtrace pripadne na promenne. |
|
Návrat nahoru |
|
|
Lemik
Založen: 30. 07. 2007 Příspěvky: 138
|
Zaslal: 21. srpen 2013, 19:31:53 Předmět: |
|
|
nou napsal: |
mam pre vas jednu chutovku
kód: |
class A{ int a; };
class B{ int b; public: virtual ~B(){} };
class C : public A, public B{ int c; };
A *a = new C;
delete a;//crash
|
|
GCC podporující -Weffc++ Tě upozorní
citace: |
warning: base class 'class A' has a non-virtual destructor [-Weffc++] |
No a pokud používáš C++11 tak používat override:
kód: |
class B
{
public:
virtual ~B() override
{}
private:
int b = 0;
}; |
a překladač hned hodí chybu
citace: |
error: 'virtual B::~B()' marked override, but does not override |
|
|
Návrat nahoru |
|
|
|