Re[10]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 08:11
Оценка:
Здравствуйте, Erop, Вы писали:

А>>Стандарт описывает не существующий указатель. И не описывает что это должно быть 0...

E>Цитаты привести не затруднит?

Erop, фонтсастика КАКОЙ ВЫ НУДНЫЙ... Это не флеймвый форум, я уже все сказал, читайте внимательно.

А>>Все мне надо работать, а не заниматься выигрыванием спров...

E>Ну слил, так слил... Хамить было не обязательно...

А>>А вообще, скажите, вам что делать нечего? Если вы постоянно сползаете на демагигию?

E>Э-э-э? Ты про это?

очень смешно — но как Вы себе представляете отличить один ноль от другого? '0' — вот этот ноль уж будьте любезны трактовать как 0 интовый, а вот этот '0' , как указатель на 0x123412344321AB00 ...

E>Вперед.

E>Стратус пишет книжки для чайников, Вы чайники?


А>>Все всё поняли.

E>Уже давно...

Не... Не те... Мы анонимы, поняли, что ответы некоторых товаришей, надо проверять и проверять. Очень часто, это бывает ошибочное мнение.
Я не слил, потому что не спорил. Я там привел примеры КОДа... Это уже не вырубишь топором. Так что слили тут "умники" местные... А я пойду работать.
Re[5]: Инициализация массива при создании его через new
От: WiseAlex Беларусь  
Дата: 07.04.09 08:12
Оценка:
если отключить secure stl и заменить в fun2 выделение из стека на выделение в хипе вот результат (VC2005):
  fun1();
0040111D  xor         ebp,ebp 
0040111F  lea         edi,[esp+18h] 
00401123  lea         esi,[esp+20h] 
00401127  mov         dword ptr [esp+18h],ebp 
0040112B  call        std::vector<int,std::allocator<int> >::_Construct_n (401250h) 
00401130  mov         edx,dword ptr [esp+24h] 
00401134  cmp         edx,ebp 
00401136  mov         ecx,1000h 
0040113B  mov         eax,2 
00401140  mov         edi,edx 
00401142  rep stos    dword ptr es:[edi] 
00401144  je          main+5Fh (40114Fh) 
00401146  push        edx  
00401147  call        operator delete (40190Ah) 
0040114C  add         esp,4 
  fun2();
0040114F  push        4000h 
00401154  call        operator new[] (4018EAh) 
00401159  mov         edx,eax 
0040115B  add         esp,4 
0040115E  mov         eax,2 
00401163  mov         edi,edx 
00401165  mov         ecx,1000h 
0040116A  push        edx  
0040116B  rep stos    dword ptr es:[edi] 
0040116D  call        operator delete (40190Ah) 
00401172  add         esp,4

все проинланилось в обоих случаях. разница только в выделении памяти — через аллокатор или просто new
т.е. сколько-нибудь заметной разницы нет вообще

стэковый вариант всегда работает быстрее (new и delete не бесплатны) — для этих целей есть boost::array
Re[11]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 08:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Стандарт описывает не существующий указатель. И не описывает что это должно быть 0...

E>>Цитаты привести не затруднит?
А>Erop, фонтсастика КАКОЙ ВЫ НУДНЫЙ... Это не флеймвый форум, я уже все сказал, читайте внимательно.
Ты сказал неправду...

А>Не... Не те... Мы анонимы, поняли, что ответы некоторых товаришей, надо проверять и проверять. Очень часто, это бывает ошибочное мнение.

О! Все ответы на форумах стоит проверять. Лучше вообще к первоисточника припадать, к стандартам, к документации на компилятор и т. п.
А ещё вежливо стоит общаться...

А>Я не слил, потому что не спорил. Я там привел примеры КОДа... Это уже не вырубишь топором. Так что слили тут "умники" местные... А я пойду работать.

Да? Тебя таки куда-то взяли? Ты зря тратишь время на форумы, IMHO, неоправданно рискуешь... Тем более в МЭК на дворе... Так что правда, иди работать, пока есть где. IMHO, это единственная твоя мудрая идея в ветке...

Кстати, ты таки топикстартер или нет? Если да, то может ты таки внятно объяснишь что у тебя за проблема?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 08:22
Оценка:
А>

А>Нет, как и сказал Андрей, только ().


А>Это чьи слова ? Правильно, ваши. Вы оказались не правы, а мне на вид ставили.


Цитируйте все, что было сказано, а не то, что вам лично удобно.
Сделаю это за вас:

Андрей Тарасевич:

Для 'new[]' поддерживается только один вид инициализатора: '()'. Т.е. можно сделать 'i = new int[5]()' и получить обнуленный массив в результате. Других иницализаторов не поддерживается, т.е. "инициализацию" придется делать потом присваиванием


Вы:
Да эта форма инициализации, мне инвестна. Можно даже вроде не только '()' но и (33)


Нет, как и сказал Андрей, только ().


А теперь попробуйте доказать свою правоту. Андрей говорит о new[], и о единственном возможном способе инициализации массива при помощи (). Я говорю о том де. Вы начинаете про (33). Ну что ж, скомпилируйте такое int * p = new int[10](33);

А>

А>А, т.е. вы не понимаете разницу между вектором и встроенным массивом? Ну-ну.

А>Я понимаю,

В таком случае, почему вы сравниваете стековый массив с вектором?

> А вы нет! И это вы отлично уже продемонмтрировали не раз — мне собрать ваши цитаты?

Собирайте.
Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 08:24
Оценка:
А>Я такой злой, так как меня однажды один из тутошних завсегдатаев-умники завалил на тестировании при преме на работу — теперь я отигрываюсь. Типа изобразал из себя умного — и знающего нечто неведомое простым смертным — ТЕМПЛЕЙТЫ....

Ах вот оно что! Т.е. вы решили свои комплексы здесь подлечить? Ну так вместо того, чтобы озлобляться и комплексовать, читните на досуге "неуча Страуструпа", он все же поумнее вас будет и вы наконец-то узнаете, в чем же разница между встроенным массивом и вектором, и когда надо использовать вектор. А то так и останетесь злобным неучем.
Of course, the code must be complete enough to compile and link.
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 08:29
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>если отключить secure stl и заменить в fun2 выделение из стека на выделение в хипе вот результат (VC2005):

...
WA>все проинланилось в обоих случаях. разница только в выделении памяти — через аллокатор или просто new
WA>т.е. сколько-нибудь заметной разницы нет вообще

WA>стэковый вариант всегда работает быстрее (new и delete не бесплатны) — для этих целей есть boost::array


Хорошо — уговорил —


#include <vector>

void _fastcall fun1 ( vector<int> * piv )
{
00402690 53               push        ebx  
    for ( register size_t jv=0; jv<0x1000; jv++ )
00402691 8B 1D FC B0 40 00 mov         ebx,dword ptr [__imp___invalid_parameter_noinfo (40B0FCh)] 
00402697 56               push        esi  
00402698 33 F6            xor         esi,esi 
0040269A 8D 9B 00 00 00 00 lea         ebx,[ebx] 
        (*piv)[jv]=2;
004026A0 8B 4F 04         mov         ecx,dword ptr [edi+4] 
004026A3 85 C9            test        ecx,ecx 
004026A5 74 0C            je          fun1+23h (4026B3h) 
004026A7 8B 47 08         mov         eax,dword ptr [edi+8] 
004026AA 2B C1            sub         eax,ecx 
004026AC C1 F8 02         sar         eax,2 
004026AF 3B F0            cmp         esi,eax 
004026B1 72 02            jb          fun1+25h (4026B5h) 
004026B3 FF D3            call        ebx  
004026B5 8B 47 04         mov         eax,dword ptr [edi+4] 
004026B8 C7 04 B0 02 00 00 00 mov         dword ptr [eax+esi*4],2 
004026BF 83 C6 01         add         esi,1 
004026C2 81 FE 00 10 00 00 cmp         esi,1000h 
004026C8 72 D6            jb          fun1+10h (4026A0h) 
004026CA 5E               pop         esi  
004026CB 5B               pop         ebx  

}
004026CC C3               ret              
--- No source file -------------------------------------------------------------
004026CD CC               int         3    
004026CE CC               int         3    
004026CF CC               int         3    
--- d:\new my projects\mql2cpp\mql2cpp\mql2cpp.cpp -----------------------------
void _fastcall fun2 ( int * pi)
{
    for ( register size_t j=0; j<0x1000; j++ )
        pi[j]=2;
}
int _tmain ( int argc, _TCHAR* argv[] )
{
004026D0 55               push        ebp  
004026D1 8B EC            mov         ebp,esp 
004026D3 83 E4 F8         and         esp,0FFFFFFF8h 
004026D6 6A FF            push        0FFFFFFFFh 
004026D8 68 8E A2 40 00   push        offset __ehhandler$_wmain (40A28Eh) 
004026DD 64 A1 00 00 00 00 mov         eax,dword ptr fs:[00000000h] 
004026E3 50               push        eax  
004026E4 64 89 25 00 00 00 00 mov         dword ptr fs:[0],esp 
004026EB 83 EC 70         sub         esp,70h 
004026EE 53               push        ebx  
004026EF 56               push        esi  
004026F0 57               push        edi  
    vector<int> iv(0x1000);
004026F1 33 DB            xor         ebx,ebx 
004026F3 8D 7C 24 28      lea         edi,[esp+28h] 
004026F7 8D 74 24 68      lea         esi,[esp+68h] 
004026FB 89 5C 24 28      mov         dword ptr [esp+28h],ebx 
004026FF E8 AC 12 00 00   call        std::vector<int,std::allocator<int> >::_Construct_n (4039B0h) 
    int i[0x1000];
    fun1( &iv );
00402704 8B FE            mov         edi,esi 
00402706 89 9C 24 84 00 00 00 mov         dword ptr [esp+84h],ebx 
0040270D E8 7E FF FF FF   call        fun1 (402690h) 
    fun2( i );



#include <vector>

void _fastcall fun1 ( vector<int> * piv )
{
    for ( register size_t jv=0; jv<0x1000; jv++ )
        (*piv)[jv]=2;

}
void _fastcall fun2 ( int * pi)
{
    for ( register size_t j=0; j<0x1000; j++ )
        pi[j]=2;
}
int _tmain ( int argc, _TCHAR* argv[] )
{
    vector<int> iv(0x1000);
    int i[0x1000];
    fun1( &iv );
    fun2( i );
}




Праметры компиляции


/O2 /Oy /GL /I "." /D "_CRT_SECURE_NO_DEPRECATE=1" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /GS- /arch:SSE2 /Zc:wchar_t- /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

Re[7]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 08:36
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, catBasilio, Вы писали:


А>>>О люди, хочу что-бы народ извинился.


А>>>
А>>>... многа бреда поскипано.
А>>>


А>Бреда? : ) Люди, ну остановитесь же — вы невладете вопросом, это был релиз... Представляю как Вы огорошены. Но я рад....


Я потратил немного своего драгоценного времени и сделал нормальный пример (релизный):

#include <Windows.h>
#include <iostream>

#include <vector>

using namespace std;

void fun1 (vector<int>& iv)
{    
  for ( size_t jv=0; jv<0x1000; jv++ )
    iv[jv]=jv;

}
void fun2 (int* i)
{
  for ( size_t j=0; j<0x1000; j++ )
    i[j]=j;
}
int _tmain ( int argc, _TCHAR* argv[] )
{
  vector<int> iv(0x1000);
  int* ia = new int[0x1000];

  DWORD initTime = GetTickCount();

  for (int i=0; i<10000; ++i)
    fun1(iv);

  DWORD timeFun1 = GetTickCount();

  for (int j=0; j<10000; ++j)
    fun2(ia);

  DWORD timeFun2 = GetTickCount();

  delete []ia;

  cout << "time(fun1)=" << timeFun1 - initTime << endl;
  cout << "time(fun2)=" << timeFun2 - timeFun1 << endl;
}


А вынес аллокацию за пределы функции так как мы тестим не аллокацию.

компилер генерит следующий код:

для fun1()
 for (int i=0; i<10000; ++i)
    fun1(iv);
00401081  xor         esi,esi 
00401083  mov         eax,dword ptr [esp+28h] 
00401087  sub         eax,dword ptr [esp+24h] 
0040108B  sar         eax,2 
0040108E  cmp         esi,eax 
00401090  jb          wmain+94h (401094h) 
00401092  call        ebp  

00401094  mov         ecx,dword ptr [esp+24h] 
00401098  mov         dword ptr [ecx+esi*4],esi 
0040109B  inc         esi  
0040109C  cmp         esi,1000h 
004010A2  jb          wmain+83h (401083h)


обрати внимание на то, что выделено жирным. Компилер в рунтайме!!! проверяет выход за границы массива!!!.

для fun2()


  for (int j=0; j<10000; ++j)
    fun2(ia);
004010B8  xor         ebp,ebp 
004010BA  xor         eax,eax 
004010BC  lea         esp,[esp] 
004010C0  mov         dword ptr [ebx+eax*4],eax 
004010C3  inc         eax  
004010C4  cmp         eax,1000h 
004010C9  jb          wmain+0C0h (4010C0h)


Никаких проверок нет

Вывод на экран:
time(fun1)=110
time(fun2)=46
sizeof(iv)=24 iv.capacity()=4096
Press any key to continue . . .

fun1 выполняется в 2.5 раза медленнее изза рунтаймовой проверки выхода за грацицу.


теперь добавляем в начало файла 2 волшебные строчки:


#define _SECURE_SCL  0
#undef _HAS_ITERATOR_DEBUGGING


и пересобираем
вывод на экран:
time(fun1)=31
time(fun2)=47
sizeof(iv)=16 iv.capacity()=4096
Press any key to continue . . .

ассемблерный код для fun1()


 for (int i=0; i<10000; ++i)
    fun1(iv);
00401060  xor         eax,eax 
00401062  mov         dword ptr [edi+eax*4],eax 
00401065  inc         eax  
00401066  cmp         eax,1000h 
0040106B  jb          wmain+62h (401062h)


Никаких проверок нет.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[8]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 08:38
Оценка: -1 :)
Здравствуйте, catBasilio, Вы писали:


B>Я потратил немного своего драгоценного времени и сделал нормальный пример (релизный):


я тоже — — здесь
Автор:
Дата: 07.04.09
Re[9]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 08:43
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, catBasilio, Вы писали:



B>>Я потратил немного своего драгоценного времени и сделал нормальный пример (релизный):


А>я тоже — — здесь
Автор:
Дата: 07.04.09

1. Не ввжу время выполнения

2. в коде присутствует:


00402691 8B 1D FC B0 40 00 mov         ebx,dword ptr [__imp___invalid_parameter_noinfo (40B0FCh)] 
00402697 56               push        esi  
00402698 33 F6            xor         esi,esi 
0040269A 8D 9B 00 00 00 00 lea         ebx,[ebx] 
        (*piv)[jv]=2;
004026A0 8B 4F 04         mov         ecx,dword ptr [edi+4] 
004026A3 85 C9            test        ecx,ecx 
004026A5 74 0C            je          fun1+23h (4026B3h) 
004026A7 8B 47 08         mov         eax,dword ptr [edi+8] 
004026AA 2B C1            sub         eax,ecx 
004026AC C1 F8 02         sar         eax,2 
004026AF 3B F0            cmp         esi,eax 
004026B1 72 02            jb          fun1+25h (4026B5h) 
004026B3 FF D3            call        ebx


Это ни что иное как проверка выхода за границу. То есть тесты не эквивалентны.
добавь в начало файла

#define _SECURE_SCL 0

а потом компиль
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[7]: Инициализация массива при создании его через new
От: WiseAlex Беларусь  
Дата: 07.04.09 08:49
Оценка:
Здравствуйте, Аноним, Вы писали:

для отключения проверок в stl —
#define _SECURE_SCL 0
или вынеси в настройки компилятора — код разительно изменится
Re[7]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:09
Оценка: :)
Ок, раз уж пошла такая пьянка, то давай померяем время.

#include <vector>

void _fastcall fun1 ( vector<int> * piv )
{
    for ( register size_t jv=0; jv<0x1000; jv++ )
        (*piv)[jv]=2;

}
void _fastcall fun2 ( int * pi)
{
    for ( register size_t j=0; j<0x1000; j++ )
        pi[j]=2;
}
int _tmain ( int argc, _TCHAR* argv[] )
{
    vector<int> iv(0x1000);
    int i[0x1000];

    LARGE_INTEGER t0,t1,t2,f;

    QueryPerformanceCounter(&t0);
    fun1( &iv );
    QueryPerformanceCounter(&t1);
    fun2( i );
    QueryPerformanceCounter(&t2);
    
    QueryPerformanceFrequency(&f);

    double d1=(t1.QuadPart-t0.QuadPart);
    double d2=(t2.QuadPart-t1.QuadPart);
    
    d1=d1/f.QuadPart;
    d2=d2/f.QuadPart;

    //t1-t0

    printf("\nt1:%22.18e sec\nt2:%22.18e sec",d1,d2);
    printf("\nt1:%44.40f sec\nt2:%44.40f sec",d1,d2);
    double d3=d1/d2;
    int i3=d3+0.5;
    printf("\n%f (%d) times. ;-)",d3,i3);
}


Вот ответ... И это на 1000-чном массиве, а что будет на 10000 Ооооо



t1:2,142027750628607600e-005 sec
t2:5,880927916865064700e-007 sec
t1: 0,0000214202775062860760000000000000000000 sec
t2: 0,0000005880927916865064700000000000000000 sec
36.423295 (36) times.

Re[8]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 09:12
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Ок, раз уж пошла такая пьянка, то давай померяем время.


добавь

#define _SECURE_SCL 0


перед #include <vector> и проверь еще.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[9]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:15
Оценка:
Здравствуйте, catBasilio, Вы писали:

B>Здравствуйте, Аноним, Вы писали:



А>>Ок, раз уж пошла такая пьянка, то давай померяем время.


B>добавь


B>
B>#define _SECURE_SCL 0
B>


B>перед #include <vector> и проверь еще.


Ок — сделал — получилось в 13 раз!!!
Re[12]: Инициализация массива при создании его через new
От: blackhearted Украина  
Дата: 07.04.09 09:18
Оценка: +1
Все дружно покормили тролля
Re[13]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:20
Оценка: :)
Здравствуйте, blackhearted, Вы писали:

B>Все дружно покормили тролля


Код на столе лежит здесь
Автор:
Дата: 07.04.09
— это доказательство того, кто тут на самом деле троль.
Re[13]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 09:23
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Все дружно покормили тролля

Начал он вполне нормальным вопросом, ну не знал он про синтаксис. Но потом его что-то прорвало и понесло.
Ясно, что тролль. Но почему-то трудно остановиться и кормежка продолжается
Of course, the code must be complete enough to compile and link.
Re[8]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 09:24
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Ок, раз уж пошла такая пьянка, то давай померяем время.


А>
А>#include <vector>

А>    double d1=(t1.QuadPart-t0.QuadPart);
А>    double d2=(t2.QuadPart-t1.QuadPart);
    
А>    d1=d1/f.QuadPart;
А>    d2=d2/f.QuadPart;

А>    double d3=d1/d2;
А>    int i3=d3+0.5;
А>}

А>


Наверное потому что я только что пообедал что-то сходу не могу сообразить что тут считается.
double d1 = .. — время выполнения fun1
double d2 = .. — время выполнения fun2

d1=d1/f.QuadPart; — отношение времени выполнения fun1() к текущему времени? зачем?
d2=d2/f.QuadPart;

выведи просто
А> double d1=(t1.QuadPart-t0.QuadPart);
А> double d2=(t2.QuadPart-t1.QuadPart);
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[10]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 09:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, catBasilio, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:



А>>>Ок, раз уж пошла такая пьянка, то давай померяем время.


B>>добавь


B>>
B>>#define _SECURE_SCL 0
B>>


B>>перед #include <vector> и проверь еще.


А>Ок — сделал — получилось в 13 раз!!!


Ассемблерный код в студию!!!
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[9]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:28
Оценка: :)
Здравствуйте, catBasilio, Вы писали:

B>Наверное потому что я только что пообедал что-то сходу не могу сообразить что тут считается.

B>double d1 = .. — время выполнения fun1
B>double d2 = .. — время выполнения fun2

B>d1=d1/f.QuadPart; — отношение времени выполнения fun1() к текущему времени? зачем?

B>d2=d2/f.QuadPart;

B>выведи просто

А>> double d1=(t1.QuadPart-t0.QuadPart);
А>> double d2=(t2.QuadPart-t1.QuadPart);

Изучи код, там все просто. И за одно и посмотри ассемблер.

Чтобы получить время — надо получить секунды, а не коунтеры.

***


ДА РАЗБЕРИТЕСЬ ЖЕ УЖЕ НАКОНЕЦ!!! люди — ВЫ НЕ ИНДУСЫ. !!!
Re[8]: Инициализация массива при создании его через new
От: WiseAlex Беларусь  
Дата: 07.04.09 09:29
Оценка:
добавь в конце строчку
printf("%u %u", iv[0], i[0]);
и удивись
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.