Инициализация массива при создании его через new
От: Аноним  
Дата: 06.04.09 11:06
Оценка:
ОСТОРОЖНО! ЭТО ТРОЛЛЬ!
Дискуссия заморожена, решение окончательное.
— Кодт


Как инициализировать массив при его создании через new?

например

что-то вроде :

int * i=NULL;

i=new int[5]={1,2,3};
Re: Инициализация массива при создании его через new
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 06.04.09 13:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как инициализировать массив при его создании через new?


Напрямую — никак. Если типы простые — то создавать массив и потом пройтись по нему в цикле и инициализировать каждый элемент.
Если элементы массива являются объектами каких-либо классов — то создать массив указателей, потом пройтись по нему в цикле и создать каждый элемент по-отдельности, через new, передавая ему нужные параметры.
С уважением, Artem Korneev.
Re: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 06.04.09 20:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>i=new int[5]={1,2,3};
А>


Не совсем понятно, "5" в этом коде -- константа? А "1, 2, 3"--?
И типы какие? Стандартные или классы?

В общем случае, если ты STL пользуешься, то можно как-то так:
template<typename T, typename TIter>
void initWith( std::vector<T>&dst, int dstCount, TIter from, TIter to )
{
    assert( dstCount >= 0 );
    dst.clear();
    dst.reserve( dstCount );
    int count = 0;
    for( TIter i = from; i != to; ++i ) {
        assert( dstCount >= ++count );
        dst.push_back( *i );
    }
    dst.resize( dstCount );
}
template<typename T, typename TIter>
void initWith( std::vector<T>&dst, int dstCount, TIter from, int initCount )
{
    initWith( dst, dstCount, from, from+initCount );
}

void foo() 
{
    std::vector<int> array;
    static const int initValues[] = { 1, 2, 3 };
    initWith( array, 5, initValues, lengthof( values ) );
}


Ну а если другая библиотека (за что я только за), то аналогичные конструкции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Инициализация массива при создании его через new
От: byleas  
Дата: 06.04.09 21:25
Оценка:
Здравствуйте, Erop, Вы писали:

E> std::vector<int> array;

E> static const int initValues[] = { 1, 2, 3 };
E> initWith( array, 5, initValues, lengthof( values ) );
В С++0х (сейчас только в gcc 4.4+) поимеем std::initializer_list и, как следствие, std::vector<int> array = { 1,2,3 }.
Re: Инициализация массива при создании его через new
От: NikeByNike Россия  
Дата: 06.04.09 21:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>что-то вроде :


А>
А>int * i=NULL;

А>i=new int[5]={1,2,3};
А>


1. подобные задачи принято решать вектором.
2. если уж очень нужно — есть такая штука как inplace new.
Т.е. ты можешь выделить неинициализированную память под весь массив, а затем пройтись по нему и проинициализировать его вручную, new(i+000)(1);
Кстати — NULL — C'шная приблуда. С++ style == 0
Нужно разобрать угил.
Re: Инициализация массива при создании его через new
От: Андрей Тарасевич Беларусь  
Дата: 06.04.09 21:54
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>Как инициализировать массив при его создании через new?


А>например


А>что-то вроде :


А>
А>int * i=NULL;

А>i=new int[5]={1,2,3};
А>


Для 'new[]' поддерживается только один вид инициализатора: '()'. Т.е. можно сделать 'i = new int[5]()' и получить обнуленный массив в результате. Других иницализаторов не поддерживается, т.е. "инициализацию" придется делать потом присваиванием.
Best regards,
Андрей Тарасевич
Re[2]: Инициализация массива при создании его через new
От: Андрей Тарасевич Беларусь  
Дата: 06.04.09 21:58
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Кстати — NULL — C'шная приблуда. С++ style == 0


Соврешенно нет. Предание старое, откуда ноги растут — неизвестно, но — нет.
Best regards,
Андрей Тарасевич
Re[3]: Инициализация массива при создании его через new
От: BigBoss  
Дата: 07.04.09 00:00
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


NBN>>Кстати — NULL — C'шная приблуда. С++ style == 0


АТ>Соврешенно нет. Предание старое, откуда ноги растут — неизвестно, но — нет.


В молодости читал рассуждения на тему типов, типа NULL суть есть указатель вроде (void *)0, а использование вместо этого (0) должно бы по уму вызывать предупреждение про преобразование целого в указатель, как в случае int* i = 1;
Но что-то там в С++ не срослось, и с 0 теперь можно
Re[4]: Инициализация массива при создании его через new
От: Андрей Тарасевич Беларусь  
Дата: 07.04.09 02:21
Оценка:
Здравствуйте, BigBoss, Вы писали:

NBN>>>Кстати — NULL — C'шная приблуда. С++ style == 0


АТ>>Соврешенно нет. Предание старое, откуда ноги растут — неизвестно, но — нет.


BB>В молодости читал рассуждения на тему типов, типа NULL суть есть указатель вроде (void *)0, а использование вместо этого (0) должно бы по уму вызывать предупреждение про преобразование целого в указатель, как в случае int* i = 1;

BB>Но что-то там в С++ не срослось, и с 0 теперь можно

Хм... Может я понял мысль, но в реальности все несколько наоборот. В С можно и '(void *) 0' и целочисленный '0'. В С++ же можно только целочисленный '0'.
Best regards,
Андрей Тарасевич
Re[2]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:15
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


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

Хорошо, с нью все так, ну а с ptr'ом ?

Типа int * ia;

ia=int[]={1,2,3,4,5};
ia=(int[]={10,10,11,20});

Да похоже что никак. Жаль. Придется потрахаться немного по больше.

Спасибо.
Re[2]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:24
Оценка: -1 :)))
Здравствуйте, Erop, Вы писали:

А>>
А>>i=new int[5]={1,2,3};
А>>


E>Не совсем понятно, "5" в этом коде -- константа? А "1, 2, 3"--?

E>И типы какие? Стандартные или классы?

E>В общем случае, если ты STL пользуешься, то можно как-то так:[c]template<typename T, typename TIter>


Совсем народ от этох "надстроек" отупел.

Какие типы — int.

Вектора, и пр. щит, не подходит — медленно.

Превратили си в скрипты, и рады.

Строка это последовательность байтов, с длинной и всё. Какие еще там супер типы string, которые в 10 раз снижают производительность программ. Нахрена это индуские вектора?! Что размер не поменять? Да какое волшебство вы ждете от них?

Перестаньте использовать то чего не понимаете, начните отличаться, от индусов.
Re[3]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 05:27
Оценка:
АТ>Соврешенно нет. Предание старое, откуда ноги растут — неизвестно

Вполне известно. Из Страуструпа и его книги "Язык программирования С++". Конечно он не так уж категоричен, но говорит что-то вроде такого:

In C, it has been popular to define a macro NULL to represent the zero pointer. Because of
C++’s tighter type checking, the use of plain 0, rather than any suggested NULL macro, leads to
fewer problems. If you feel you must define NULL , use
const int NULL = 0 ;
The const qualifier (§5.4) prevents accidental redefinition of NULL and ensures that NULL can be
used where a constant is required.

Of course, the code must be complete enough to compile and link.
Re[2]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:31
Оценка: 6 (1) -1 :))
Здравствуйте, NikeByNike, Вы писали:

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


А>>что-то вроде :


А>>
А>>int * i=NULL;

А>>i=new int[5]={1,2,3};
А>>


NBN>1. подобные задачи принято решать вектором.

NBN>2. если уж очень нужно — есть такая штука как inplace new.
NBN>Т.е. ты можешь выделить неинициализированную память под весь массив, а затем пройтись по нему и проинициализировать его вручную, new(i+000)(1);
NBN>Кстати — NULL — C'шная приблуда. С++ style == 0

А мне надо сотни тысяч раз в секунду! Ничего что я тут со своими глупыми задачами в вам умным пристаю?!

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

Скорость работы с такими массивами

int i[100];

и vector<int> iv;

Различается в дестяки раз. А памяти лишней сколько жрется.

А потом удивляются — 8 гигов и все мало.

NULL это ПРАВИЛЬНО и только так — для скриптовиков и 0 сойдет, понятно — но указатель это 64 бита или 128 как уменя, а 0 это только 32.
Re[3]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 05:33
Оценка:
А>Да эта форма инициализации, мне инвестна. Можно даже вроде не только '()' но и (33)
Нет, как и сказал Андрей, только ().
А по поводу неудобства инициализации — есть такое. Видимо, в будущем это пофиксят при помощи нового синтаксиса инициализаторов для стандартных контейнеров или пользовательских классов. Синтаксиса не помню, но что нить вроде std::vector<int> a = {1,2,3,4,5};
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:38
Оценка: -2 :))
Здравствуйте, Lorenzo_LAMAS, Вы писали:

АТ>>Соврешенно нет. Предание старое, откуда ноги растут — неизвестно


L_L>Вполне известно. Из Страуструпа и его книги "Язык программирования С++". Конечно он не так уж категоричен, но говорит что-то вроде такого:


L_L>

L_L>In C, it has been popular to define a macro NULL to represent the zero pointer. Because of
L_L>C++’s tighter type checking, the use of plain 0, rather than any suggested NULL macro, leads to
L_L>fewer problems. If you feel you must define NULL , use
L_L>const int NULL = 0 ;
L_L>The const qualifier (§5.4) prevents accidental redefinition of NULL and ensures that NULL can be
L_L>used where a constant is required.


У меня в архитектуре int 32 бита а указатель ( это адрес, для скриптовиков ) 128 бит. И что? '0' это 0... У меня по адресу ноль есть данные... Что дальше? Ваш неучь Страуструп нихрена не понимает вообще в СИ и СИ++... Перестаньте читать идиотов.
Re[2]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 05:42
Оценка:
Здравствуйте, Erop, Вы писали:

E>В общем случае, если ты STL пользуешься, то можно как-то так:
template<typename T, typename TIter>
E>void initWith( std::vector<T>&dst, int dstCount, TIter from, TIter to )
E>{
E>    assert( dstCount >= 0 );
E>    dst.clear();
E>    dst.reserve( dstCount );
E>    int count = 0;
E>    for( TIter i = from; i != to; ++i ) {
E>        assert( dstCount >= ++count );
E>        dst.push_back( *i );
E>    }
E>    dst.resize( dstCount );
E>}
E>template<typename T, typename TIter>
E>void initWith( std::vector<T>&dst, int dstCount, TIter from, int initCount )
E>{
E>    initWith( dst, dstCount, from, from+initCount );
E>}

E>void foo() 
E>{
E>    std::vector<int> array;
E>    static const int initValues[] = { 1, 2, 3 };
E>    initWith( array, 5, initValues, lengthof( values ) );
E>}


Зачем так сложно?

#define ARRAY_LENGTH(x) sizeof(x) / sizeof(x[0])

void foo()
{
  static const int initValues[] = { 1, 2, 3 };
  std::vector<int> array(initValues, initValies + ARRAY_LENGTH(initValues));
}
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[3]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 05:46
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Совсем народ от этох "надстроек" отупел.


А>Какие типы — int.


А>Вектора, и пр. щит, не подходит — медленно.


А>Превратили си в скрипты, и рады.


А>Строка это последовательность байтов, с длинной и всё. Какие еще там супер типы string, которые в 10 раз снижают производительность программ. Нахрена это индуские вектора?! Что размер не поменять? Да какое волшебство вы ждете от них?


А>Перестаньте использовать то чего не понимаете, начните отличаться, от индусов.


Тут недавно топик был — сравнивали производитьность рабтоы с вектором и просто с массивом. Так по тестам (проверенным несколькими людьми) оказалось что вектор быстрее работает)
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[5]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 05:48
Оценка: 1 (1) +1
А>У меня в архитектуре int 32 бита а указатель ( это адрес, для скриптовиков ) 128 бит. И что? '0' это 0... У меня по адресу ноль есть данные... Что дальше? Ваш неучь Страуструп нихрена не понимает вообще в СИ и СИ++... Перестаньте читать идиотов.

Следуя вашему совету, я не должен был читать вашего дико бредового сообщения. Простите за грубость, конечно, но не пишите фигню и не указывайте мне, кого мне читать, а кого — нет. Я уж как-нибудь сам разберусь.
Чисто для справки, не знаю, сколько вам лет, но уверен, что Страуструп знал С тогда, когда вас на свете еще не было.
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:49
Оценка: :)
Здравствуйте, catBasilio, Вы писали:

А>>Перестаньте использовать то чего не понимаете, начните отличаться, от индусов.


B>Тут недавно топик был — сравнивали производитьность рабтоы с вектором и просто с массивом. Так по тестам (проверенным несколькими людьми) оказалось что вектор быстрее работает)


Неверные разультаты , Причем заметьте, я даже и топик не читал — так как подругому и быть не может. 1000%
Re[3]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 05:52
Оценка: +2
А>Скорость работы с такими массивами
А>int i[100];
А>и vector<int> iv;
А>Различается в дестяки раз. А памяти лишней сколько жрется.

Бред. Чтобы не писать такого больше, элементарно поглядите код вектора и что будет, если вы напишете std::vector<int> v(some_size);

А>А потом удивляются — 8 гигов и все мало.


Учите матчасть.

А>NULL это ПРАВИЛЬНО и только так — для скриптовиков и 0 сойдет, понятно — но указатель это 64 бита или 128 как уменя, а 0 это только 32.


Т.е., вы полагаете, что если вы
int * a = 0; то у вас занулится лишь часть битов, а часть — останутся неинициализированными? Да вы жжете, батенька. А еще и Страуструп у вас — "неучь"
Of course, the code must be complete enough to compile and link.
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 05:54
Оценка: -1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>У меня в архитектуре int 32 бита а указатель ( это адрес, для скриптовиков ) 128 бит. И что? '0' это 0... У меня по адресу ноль есть данные... Что дальше? Ваш неучь Страуструп нихрена не понимает вообще в СИ и СИ++... Перестаньте читать идиотов.


L_L>Следуя вашему совету, я не должен был читать вашего дико бредового сообщения. Простите за грубость, конечно, но не пишите фигню и не указывайте мне, кого мне читать, а кого — нет. Я уж как-нибудь сам разберусь.

L_L>Чисто для справки, не знаю, сколько вам лет, но уверен, что Страуструп знал С тогда, когда вас на свете еще не было.

Да и бог с ним. Он пишет БРЕД. Ноль это 0, NULL это не существующий адрес, зависящий от архитекуры. И что? Это факт, Ваш Стратус написал вранье, а сколько его там, кроме этого, уже и не вспомню. Но просто убогий писатель. Деньги зарабатываает тем что пишет книжки, но предмета не знает. Это факт.
Re[7]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 05:57
Оценка:
А>Ваш Стратус написал вранье, а сколько его там, кроме этого, уже и не вспомню. Но просто убогий писатель. Деньги зарабатываает тем что пишет книжки, но предмета не знает. Это факт.

Скажите, это вы так шутите/троллите своеобразно?
Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 06:00
Оценка:
А>Да и бог с ним. Он пишет БРЕД. Ноль это 0, NULL это не существующий адрес, зависящий от архитекуры.
Вы точно знаете, что такое NULL? Как настоящий знаток С, не чета Страуструпу, стандарт С вы читали?

7.17 Common definitions <stddef.h>
3 The macros are
NULL
which expands to an implementation-defined null pointer constant


слова null pointer constant вам что-то говорят?
Of course, the code must be complete enough to compile and link.
Re[5]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 06:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Неверные разультаты , Причем заметьте, я даже и топик не читал — так как подругому и быть не может. 1000%


Вектор выделяет память одним куском. Поэтому реальный объем памяти который потребляет вектор будет складываться из следующих параметров:
capacity — количество заразервированных байт (capacity() >= length())
значение length (sizeof(size_t)) — текущий размер вектора
значение capacity (sizeof(size_t)) — текущее значение capacity
и все!!!

Причем если для вектора взять указатель на первый элемент &array[0] то с ним можно работать как с простым массивом. И стандарт это ГАРАНТИРУЕТ!!!
Замедления работы через operator[] связаны с тем, что в дебажном режиме компиляции стл делает дополнительные проверки, которые отсутствуют в релизе. Поэтому релизный operator [] ничем не отличается от обращения к элементу сишного массива.
Так что поучил бы сначала матчасть, и тесты бы погонял, а потом уж делал такие заявления.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[3]: Не запретить ли анонимов и в профильных форумах?
От: igna Россия  
Дата: 07.04.09 06:11
Оценка: 9 (1) +1 -1
А>Скорость работы с такими массивами

А>int i[100];


А>и vector<int> iv;


А>Различается в дестяки раз. А памяти лишней сколько жрется.


IMHO анонимов неплохо бы запретить и в профильных форумах.
Re[3]: Инициализация массива при создании его через new
От: jazzer Россия Skype: enerjazzer
Дата: 07.04.09 06:13
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Скорость работы с такими массивами


А>int i[100];


А>и vector<int> iv;


А>Различается в дестяки раз. А памяти лишней сколько жрется.


Код в студию.
Померяем вместе.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 06:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>
А>>>i=new int[5]={1,2,3};
А>>>


E>>Не совсем понятно, "5" в этом коде -- константа? А "1, 2, 3"--?

E>>И типы какие? Стандартные или классы?

E>>В общем случае, если ты STL пользуешься, то можно как-то так:
template<typename T, typename TIter>

А>Совсем народ от этох "надстроек" отупел. :) 
Повежливее бы, что ли...

А>Какие типы - int. :) 
Ну из вопроса топикстартера не понятно какие типы... 

А>Вектора, и пр. щит, не подходит - медленно.
Да? А можешь пояснить в чём разница между [c]std::vector<int> v;
v.reserve( 5 );
и new int[5]?


Кстати, так, как хочет автор в "чистом С++" нельзя...

А>Перестаньте использовать то чего не понимаете, начните отличаться, от индусов.


Ах, мне вот тоже STL не нравится. Но чтобы не использовать надо таки понимать почему не используешь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 06:53
Оценка:
Здравствуйте, catBasilio, Вы писали:

B>Зачем так сложно?


B>
B>#define ARRAY_LENGTH(x) sizeof(x) / sizeof(x[0])

B>void foo()
B>{
B>  static const int initValues[] = { 1, 2, 3 };
B>  std::vector<int> array(initValues, initValies + ARRAY_LENGTH(initValues));
B>}
B>


Этот код делает другое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 06:56
Оценка: :)
Здравствуйте, jazzer, Вы писали:

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


А>>Скорость работы с такими массивами


А>>int i[100];


А>>и vector<int> iv;


А>>Различается в дестяки раз. А памяти лишней сколько жрется.


J>Код в студию.

J>Померяем вместе.



наслаждайтесь ...

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


void fun1 ( )
{
004026B0 83 EC 1C         sub         esp,1Ch 
004026B3 53               push        ebx  
004026B4 55               push        ebp  
004026B5 56               push        esi  
004026B6 57               push        edi  
    vector<int> iv(0x1000);
004026B7 8D 7C 24 14      lea         edi,[esp+14h] 
004026BB 8D 74 24 18      lea         esi,[esp+18h] 
004026BF C7 44 24 14 00 00 00 00 mov         dword ptr [esp+14h],0 
004026C7 E8 F4 12 00 00   call        std::vector<int,std::allocator<int> >::_Construct_n (4039C0h) 

    for ( size_t jv=0; jv<0x1000; jv++ )
004026CC 8B 5C 24 20      mov         ebx,dword ptr [esp+20h] 
004026D0 8B 7C 24 1C      mov         edi,dword ptr [esp+1Ch] 
004026D4 8B 2D FC A0 40 00 mov         ebp,dword ptr [__imp___invalid_parameter_noinfo (40A0FCh)] 
004026DA 33 F6            xor         esi,esi 
004026DC 8D 64 24 00      lea         esp,[esp] 
        iv[jv]=2;
004026E0 85 FF            test        edi,edi 
004026E2 74 0B            je          fun1+3Fh (4026EFh) 
004026E4 8B C3            mov         eax,ebx 
004026E6 2B C7            sub         eax,edi 
004026E8 C1 F8 02         sar         eax,2 
004026EB 3B F0            cmp         esi,eax 
004026ED 72 02            jb          fun1+41h (4026F1h) 
004026EF FF D5            call        ebp  
004026F1 C7 04 B7 02 00 00 00 mov         dword ptr [edi+esi*4],2 
004026F8 83 C6 01         add         esi,1 
004026FB 81 FE 00 10 00 00 cmp         esi,1000h 
00402701 72 DD            jb          fun1+30h (4026E0h) 

}
00402703 85 FF            test        edi,edi 
00402705 74 09            je          fun1+60h (402710h) 
00402707 57               push        edi  
00402708 E8 6D 69 00 00   call        operator delete (40907Ah) 
0040270D 83 C4 04         add         esp,4 
00402710 5F               pop         edi  
00402711 5E               pop         esi  
00402712 5D               pop         ebp  
00402713 5B               pop         ebx  
00402714 83 C4 1C         add         esp,1Ch 
00402717 C3               ret              
--- No source file -------------------------------------------------------------
00402718 CC               int         3    
00402719 CC               int         3    
0040271A CC               int         3    
0040271B CC               int         3    
0040271C CC               int         3    
0040271D CC               int         3    
0040271E CC               int         3    
0040271F CC               int         3    
--- 11.cpp -----------------------------
void fun2 ()
{
    int i[0x1000];

    for ( size_t j=0; j<0x1000; j++ )
        i[j]=2;

}
int _tmain ( int argc, _TCHAR* argv[] )
{
00402720 55                        push        ebp  
00402721 8B EC                   mov         ebp,esp 
00402723 83 E4 F8               and         esp,0FFFFFFF8h 
00402726 6A FF                   push        0FFFFFFFFh 
00402728 68 96 9C 40 00      push        offset __ehhandler$_wmain (409C96h) 
0040272D 64 A1 00 00 00 00 mov         eax,dword ptr fs:[00000000h] 
00402733 50                        push        eax  
00402734 83 EC 60              sub         esp,60h 
00402737 53                        push        ebx  
00402738 56                        push        esi  
00402739 57                        push        edi  
0040273A A1 1C 10 41 00     mov         eax,dword ptr [___security_cookie (41101Ch)] 
0040273F 33 C4                   xor         eax,esp 
00402741 50                        push        eax  
00402742 8D 44 24 70          lea         eax,[esp+70h] 
00402746 64 A3 00 00 00 00 mov         dword ptr fs:[00000000h],eax 


    fun1();
0040274C E8 5F FF FF FF   call        fun1 (4026B0h) 
    fun2();

...



Это получилолсь из — >

#include <vector>

void fun1 ( )
{
    vector<int> iv(0x1000);

    for ( size_t jv=0; jv<0x1000; jv++ )
        iv[jv]=2;

}
void fun2 ()
{
    int i[0x1000];

    for ( size_t j=0; j<0x1000; j++ )
        i[j]=2;

}
int _tmain ( int argc, _TCHAR* argv[] )
{

    fun1();
    fun2();
}
Re[5]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 06:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня в архитектуре int 32 бита а указатель ( это адрес, для скриптовиков ) 128 бит. И что? '0' это 0... У меня по адресу ноль есть данные... Что дальше? Ваш неучь Страуструп нихрена не понимает вообще в СИ и СИ++...


И то, что ты не знаешь С++.
В С++ 0 -- это литерал, который может обозначать интегральный 0, а может и нулевой указатель. Бинарное представление нулевого указателя при этом может быть каким угодно. На многих архитектурах, кстати, указатели вообще имеют более сложную структуру, чем одно число...


А>Перестаньте читать идиотов.

Ну они всё пишут и пишут... Случайно можно и прочитать...
Страуструп, кстати, вряд ли идиот, в отличии от некоторых коллег...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Не запретить ли анонимов и в профильных форумах?
От: Erop Россия  
Дата: 07.04.09 07:01
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO анонимов неплохо бы запретить и в профильных форумах.


Так плохо, так как вопрос задать будет сложнее

Можно по IP, например, банить.
А можно просто выделять сообщения от подозрительных ip. Либо иметь опцию "не показывать сообщения от анонимов, и всё, что растёт из них"...

Ну, либо "огонь! безжалостный огонь!"
Я бы вот бомбу повесил, но опасаюсь кар модераторов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:02
Оценка:
Здравствуйте, Erop, Вы писали:

А>>У меня в архитектуре int 32 бита а указатель ( это адрес, для скриптовиков ) 128 бит. И что? '0' это 0... У меня по адресу ноль есть данные... Что дальше? Ваш неучь Страуструп нихрена не понимает вообще в СИ и СИ++...


E>И то, что ты не знаешь С++.

E>В С++ 0 -- это литерал, который может обозначать интегральный 0, а может и нулевой указатель. Бинарное представление нулевого указателя при этом может быть каким угодно. На многих архитектурах, кстати, указатели вообще имеют более сложную структуру, чем одно число...


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

Вперед.

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

E>Страуструп, кстати, вряд ли идиот, в отличии от некоторых коллег...


Да, не идиот, я не прав. Извини Статус.
Re[5]: Не запретить ли анонимов и в профильных форумах?
От: Lorenzo_LAMAS  
Дата: 07.04.09 07:08
Оценка:
E>Я бы вот бомбу повесил, но опасаюсь кар модераторов...
А почему? Я — нет. Вешаю.
Of course, the code must be complete enough to compile and link.
Re[6]: Не запретить ли анонимов и в профильных форумах?
От: Аноним  
Дата: 07.04.09 07:11
Оценка: :)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

E>>Я бы вот бомбу повесил, но опасаюсь кар модераторов...

L_L>А почему? Я — нет. Вешаю.

Сдались... Скриптовики... ха-ха...

здесь
Автор:
Дата: 07.04.09
я привел пример того как вы заблуждаетесь, и насколько вы не понимаете то что используете.!!!

Давафате дебангалориться, пора уже...
Re[5]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 07:17
Оценка: +2
А>О люди, хочу что-бы народ извинился.
Ну-ну.

А почему у вас вектор сравнивается со стековым массивом, а не с массивом в динамической памяти?
Of course, the code must be complete enough to compile and link.
Re[3]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да похоже что никак. Жаль. Придется потрахаться немного по больше.


А что у тебя таки за задача? Обычно С++ достаточно гибок, чтобы что-то придумать, просто не всегда лекарство лучше болезни

Скажем можно предложить такую мульку:
template<typename T, int N> T* newInitedArray( int count, const T (&src)[N] )
{
    T* res = new[count];
    if( count > N )
        count = N;
    for( int i = 0; i < count; i++ )
        res[i] = src[i];
    return res;
}
и использовать так:
void foo()
{
    int patt[] = { 1, 2, 3 };
    int* newI = newInitedArray( 5, patt );
}


А можно и так:
template<typename T>
class ArrayCreator {
    enum { maxDataCount = 3 };
    enum { useDataCount = -1 };
public:
    ArrayCreator() { init( 0 ); }
    ArrayCreator( const T& a1 ) { init( 1, &a1 ); }
    ArrayCreator( const T& a1, const T& a2 ) { init( 2, &a1, &a2 ); }
    ArrayCreator( const T& a1, const T& a2, const T& a3 ) { init( 3, &a1, &a2, &a3 ); }
    //...

    const T* Begin() const { return data; }
    const T* End() const { return data + dataCount; }

    T* NewArray( int count = useDataCount );
    std::vector<T> CreateVector( int count = useDataCount );

    void Init( T* dst, int count );
    void Init( std::vector<T>& dst, int count = useDataCount );
    template<int N>
    voiud Init( T (&dst)[N] ); 
private:
    T data[maxDataCount];
    int dataCount;

    void init( int dCount, ... )
    //...
};


Ну и используешь как-то так:
vpod foo()
{
    int* p = ArrayCreator<int>( 1, 2, 3 ).NewArray( 5 );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:20
Оценка: -1 :))
Здравствуйте, Lorenzo_LAMAS, Вы писали:

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

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

L_L>А по поводу неудобства инициализации — есть такое. Видимо, в будущем это пофиксят при помощи нового синтаксиса инициализаторов для стандартных контейнеров или пользовательских классов. Синтаксиса не помню, но что нить вроде std::vector<int> a = {1,2,3,4,5};


Нет, я все глупости найду и ткну — ребята, а вы случайно на работу принимая народ не тестируете? С такими знаниями, эх... жуть, куда страна катится!!!


 int *i=new int(0x33);


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

А>>Да похоже что никак. Жаль. Придется потрахаться немного по больше.


E>А что у тебя таки за задача? Обычно С++ достаточно гибок, чтобы что-то придумать, просто не всегда лекарство лучше болезни


Спасибо , задача простая — но расказывать очень долго. Но главное, чтобы работа с массивом была быстрой. Изменение размера не нужно...

Поэтому вектора и прочий шит не подходит — медленно.
Re[5]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 07:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>наслаждайтесь ...


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



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



А>Это получилолсь из — >


А>
А>#include <vector>

А>void fun1 ( )
А>{
А>    vector<int> iv(0x1000);

А>    for ( size_t jv=0; jv<0x1000; jv++ )
А>        iv[jv]=2;

А>}
А>void fun2 ()
А>{
А>    int i[0x1000];

А>    for ( size_t j=0; j<0x1000; j++ )
А>        i[j]=2;

А>}
А>int _tmain ( int argc, _TCHAR* argv[] )
А>{

А>    fun1();
А>    fun2();
А>}
А>


1. А теперь откомпиль это в релизе с максимальной оптимизацией и запость опять.
2. В том же релизном коде замерь время выполнения функций fun1, fun2 и результаты опять давай нам.
3. выведи значения sizeof(iv), iv.capacity(), sizeof(i) (для int i[0x1000]) и результаты обратно в форум.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[5]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 07:26
Оценка:
А>
А> int *i=new int(0x33);
А>


А>Прекрасно работает.

А как это связано с инициализацией элементов массива, о чем и шла речь? Вы глупости и дурака лучше в зеркале поищите.
Of course, the code must be complete enough to compile and link.
Re[3]: Инициализация массива при создании его через new
От: sokel Россия  
Дата: 07.04.09 07:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скорость работы с такими массивами int i[100] и vector<int> iv различается в дестяки раз.


Исходя из вопроса, используется всё таки массив, созданный через new, а это уже совсем не то же самое что массив, созданный на стеке.

Скорость работы не отличается (да и не с чего ей отличаться). А вот скорость создания/уничтожения — тут да, но опять таки, используется массив, выделяемый через стандартный new, так что, скорей всего, правильный вектор будет быстрее элементарно за счёт использования правильного аллокатора.

А>А памяти лишней сколько жрется.


А сколько? Динамическое выделение предполагает относительно большой объём, так что на служебные данные вектора вроде размера и т.п. (собственно sizeof(vector)) можно не обращать внимания. Конечно, если вектор не будет зарезервирован, возможно памяти будет использовано больше. Но размер тебе известен, так что reserve в руки...
Re[7]: Не запретить ли анонимов и в профильных форумах?
От: Lorenzo_LAMAS  
Дата: 07.04.09 07:27
Оценка: +1 :)
А>Давафате дебангалориться, пора уже...

Это вы на вашем родном, индусском?
Of course, the code must be complete enough to compile and link.
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:32
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

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

L_L>Ну-ну.

Что ну-ну...

ЛНС?

L_L>А почему у вас вектор сравнивается со стековым массивом, а не с массивом в динамической памяти?


А почему нельзя, что-ли. Чем такие массивы провинились.

Давайте, говрите, что-то типа — ай-ай как мы были не правы. — Это полезно, на самом деле.
Re[4]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 07:32
Оценка:
Здравствуйте, Erop, Вы писали:

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


B>>Зачем так сложно?


B>>
B>>#define ARRAY_LENGTH(x) sizeof(x) / sizeof(x[0])

B>>void foo()
B>>{
B>>  static const int initValues[] = { 1, 2, 3 };
B>>  std::vector<int> array(initValues, initValies + ARRAY_LENGTH(initValues));
B>>}
B>>


E>Этот код делает другое...




void foo()
{
  static const int initValues[] = { 1, 2, 3 };
  std::vector<int> array(5);
  array.insert(array.begin(), initValues, initValies + ARRAY_LENGTH(initValues));
}
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[7]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 07:35
Оценка: :)
А>А почему нельзя, что-ли. Чем такие массивы провинились.

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

А>Давайте, говрите, что-то типа — ай-ай как мы были не правы. — Это полезно, на самом деле.


Уговорили. Ай-ай, как вы были не правы.
Of course, the code must be complete enough to compile and link.
Re[8]: Не запретить ли анонимов и в профильных форумах?
От: Аноним  
Дата: 07.04.09 07:37
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>Давафате дебангалориться, пора уже...


L_L>Это вы на вашем родном, индусском?


Тафайте-тафайте, я уже заждался.
Re[4]: Инициализация массива при создании его через new
От: sokel Россия  
Дата: 07.04.09 07:38
Оценка:
Здравствуйте, sokel, Вы писали:

хехе, но с другой стороны, вопрос о списке инициализации, так что массив предположительно небольшой, тогда зачем нужен new?
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:42
Оценка: :)
Здравствуйте, catBasilio, Вы писали:

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


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


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

Я такой злой, так как меня однажды один из тутошних завсегдатаев-умники завалил на тестировании при преме на работу — теперь я отигрываюсь. Типа изобразал из себя умного — и знающего нечто неведомое простым смертным — ТЕМПЛЕЙТЫ....
Re[5]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:44
Оценка:
Здравствуйте, catBasilio, Вы писали:

B>
B>void foo()
B>{
B>  static const int initValues[] = { 1, 2, 3 };
B>  std::vector<int> array(5);
B>  array.insert(array.begin(), initValues, initValies + ARRAY_LENGTH(initValues));
B>}
B>


Этот код тоже не то делает. Да ещё и тормозной, к тому же...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:49
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Ну стандарт почитай...
Я же говорю, что ты С++ плохо знаешь...
А>Вперед.
Чисто для справки. Всё что ниже -- валидно...
void foo( void* );
void foo( int );

void bar()
{
    int i = 0;
    int* p = 0;

    void (*Pf)( int ) = foo;
}


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

Обычно неаккуратное использование кванторов всеобщности характерно для недоучек...
А что касается автора С++, то он разные книжки написал и пишет. Некоторые вовсе и не для чайников. Хотя я лично по языку С++ справляюсь в стандарте, чего и тебе советую.. Например изучить что там написано про нулевые указатели (как в стандарте С, так и в стандарте С++)

E>>Страуструп, кстати, вряд ли идиот, в отличии от некоторых коллег...

А>Да, не идиот, я не прав. Извини Статус.
Так ты ещё и со "Статусом" беседуешь? Бывает...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:52
Оценка: -1 :)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>
А>> int *i=new int(0x33);
А>>


А>>Прекрасно работает.

L_L>А как это связано с инициализацией элементов массива, о чем и шла речь? Вы глупости и дурака лучше в зеркале поищите.

Эй!


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


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


Это ответ также и на :

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


Я понимаю, А вы нет! И это вы отлично уже продемонмтрировали не раз — мне собрать ваши цитаты?
Re[5]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:54
Оценка:
Здравствуйте, Аноним, Вы писали:

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


О Аноним!
1) Зарегься
2) Иди потом в народ...


А вообще-то std::vector не умеет хранить буфер в объекте. Это массив в динамической памяти, то есть аналог new int[0x1000]... а вовсе и не автоматического массива...
Если уж меряться, то честно, а то сравнил, понимаешь, попу с пальцем...

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

А>Я такой злой, так как меня однажды один из тутошних завсегдатаев-умники завалил на тестировании при преме на работу — теперь я отигрываюсь. Типа изобразал из себя умного — и знающего нечто неведомое простым смертным — ТЕМПЛЕЙТЫ....


А что, на заботать ТЕМПЛЕЙТЫ кебы не хватило?
Тоже мне, нашёл чем хвастаться...

Таки, кстати, что за опции-то у компилятора были?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:57
Оценка:
Здравствуйте, sokel, Вы писали:

S>хехе, но с другой стороны, вопрос о списке инициализации, так что массив предположительно небольшой, тогда зачем нужен new?


В чём суть проблемы топикстартера я тоже не понимаю...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 07:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нет, я все глупости найду и ткну — ребята, а вы случайно на работу принимая народ не тестируете? С такими знаниями, эх... жуть, куда страна катится!!!


А>
А> int *i=new int(0x33);
А>


А>Прекрасно работает.


Что-то мне таки кажется, что я бы тебя тоже завернул
1) Не умеешь себя вести.
2) При этом очень невнимательный и не понимаешь что у тебя спросили...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 07:59
Оценка: :)
Здравствуйте, Erop, Вы писали:

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

E>Обычно неаккуратное использование кванторов всеобщности характерно для недоучек...
E>А что касается автора С++, то он разные книжки написал и пишет. Некоторые вовсе и не для чайников. Хотя я лично по языку С++ справляюсь в стандарте, чего и тебе советую.. Например изучить что там написано про нулевые указатели (как в стандарте С, так и в стандарте С++)

E>>>Страуструп, кстати, вряд ли идиот, в отличии от некоторых коллег...

А>>Да, не идиот, я не прав. Извини Стратус.
E>Так ты ещё и со "Статусом" беседуешь? Бывает...

ЕРОП, идите в политику, там вас заждались... И там демогогте.

Стандарт описывает не существующий указатель. И не описывает что это должно быть 0... Все мне надо работать, а не заниматься выигрыванием спров... Я уже получил удовольствие, от того что показал скриптовикам с векторами того что они не знали но проверяли знания у людей при приеме на работу. Выграть спор не есть моя цель, поэтому не старайтесь, я обязательно буду применять стандарные ходы, не позволяющие выграть спор будучи не правым. А вообще, скажите, вам что делать нечего? Если вы постоянно сползаете на демагигию?

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

А>Поэтому вектора и прочий шит не подходит — медленно.


Не понятно. По идее вектор же может зарезервировать место, и потом его не менять уже. Ты всякие там insert/erase не зови просто и не добавляй больше, чем зарезервировал...

Правда у std::vector есть другие косяки и проблемы с производительностью, ну так массивов-то куча просто под С++ написали уже...

Но это всё не про то. Ты что-то про инициализацию говорил?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 08:05
Оценка:
Здравствуйте, Аноним, Вы писали:

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

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


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

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

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

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

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

Вперед.

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


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

Уже давно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 08:06
Оценка: :)
Здравствуйте, Erop, Вы писали:
А>>Нет, я все глупости найду и ткну — ребята, а вы случайно на работу принимая народ не тестируете? С такими знаниями, эх... жуть, куда страна катится!!!
А>>
А>> int *i=new int(0x33);
А>>

А>>Прекрасно работает.

E>Что-то мне таки кажется, что я бы тебя тоже завернул

E>1) Не умеешь себя вести.
E>2) При этом очень невнимательный и не понимаешь что у тебя спросили...

Ага, юлим — рыба редкой породы, обладает удивительным свойством вылезать из ловушек расставленных рыбаками.
Re[7]: Инициализация массива при создании его через new
От: Erop Россия  
Дата: 07.04.09 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ага, юлим — рыба редкой породы, обладает удивительным свойством вылезать из ловушек расставленных рыбаками.


Самокритичный, ты наш!!!
Топик посвящён инициализации аллокируемого по new МАССИВА!!!
Ферштейн?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
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]);
и удивись
Re[9]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:35
Оценка: -1 :)
Здравствуйте, WiseAlex, Вы писали:

WA>добавь в конце строчку

WA>printf("%u %u", iv[0], i[0]);
WA>и удивись

Ну нифига!!! И зачем это добавлять и так, нормально. А вот нет у меня другого кода.
Re[10]: Инициализация массива при создании его через new
От: WiseAlex Беларусь  
Дата: 07.04.09 09:41
Оценка: 14 (1) :)
Здравствуйте, Аноним, Вы писали:

А>Ну нифига!!! И зачем это добавлять и так, нормально. А вот нет у меня другого кода.

оптимизатор вполне резонно посчитал что i нигде не использует и просто весь код выбросил
printf объяснил что i нам нужен — вот и вся магия ...
в итоге вектор в 4 раза быстрее на этом примере
Re[10]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 09:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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);

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


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


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

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


А>>Ну нифига!!! И зачем это добавлять и так, нормально. А вот нет у меня другого кода.

WA>оптимизатор вполне резонно посчитал что i нигде не использует и просто весь код выбросил
WA>printf объяснил что i нам нужен — вот и вся магия ...
WA>в итоге вектор в 4 раза быстрее на этом примере

В итоге, на таком искуственном (!!!) изгонении назница НОЛЬ. Но в рельности такое будет очень редко. Так что вектора это шит. И не надо его совать туда где он нахрен не нужен. !!!
Re[12]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 09:47
Оценка: +1 :)
А>В итоге, на таком искуственном (!!!) изгонении назница НОЛЬ. Но в рельности такое будет очень редко. Так что вектора это шит. И не надо его совать туда где он нахрен не нужен. !!!

Вектор в 4 раза быстрее == "назница НОЛЬ" для тебя? "Но в рельности такое будет очень редко. Так что вектора это шит" — шит потому, что
быстрее? Да ты индус! Тебя Кумар зовут?
Re[6]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 09:49
Оценка: +1
Здравствуйте, Erop, Вы писали:

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


S>>хехе, но с другой стороны, вопрос о списке инициализации, так что массив предположительно небольшой, тогда зачем нужен new?


E>В чём суть проблемы топикстартера я тоже не понимаю...

http://en.wikipedia.org/wiki/Troll_(Internet)
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация массива при создании его через new
От: igna Россия  
Дата: 07.04.09 09:51
Оценка: -1 :)
Здравствуйте, Erop, Вы писали:

E>Но чтобы не использовать надо таки понимать почему не используешь...




Нет, правда ... Разве из твоего высказывания логически не следует, что если не понимаешь, то надо использовать?
Re[10]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 09:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>ДА РАЗБЕРИТЕСЬ ЖЕ УЖЕ НАКОНЕЦ!!! люди — ВЫ НЕ ИНДУСЫ. !!!


разобрался!!!

вот ассемблерный код

  LARGE_INTEGER t0,t1,t2,f;

  QueryPerformanceCounter(&t0);
00401046  lea         eax,[esp+54h] 
0040104A  mov         dword ptr [esp+0C0h],ebx 
00401051  mov         esi,dword ptr [__imp__QueryPerformanceCounter@4 (402000h)] 
00401057  push        eax  
00401058  call        esi  
  fun1( &iv );
0040105A  mov         ebx,dword ptr [esp+78h] 
0040105E  mov         eax,2 
00401063  mov         ecx,1000h 
00401068  mov         edi,ebx 
0040106A  rep stos    dword ptr es:[edi] 
  QueryPerformanceCounter(&t1);
0040106C  lea         ecx,[esp+4Ch] 
00401070  push        ecx  
00401071  call        esi  
  fun2( i );
  QueryPerformanceCounter(&t2);
00401073  lea         edx,[esp+5Ch] 
00401077  push        edx  
00401078  call        esi


в случае с вектором он чесно заполняет массив двойками.
а функцию fun2 компилятор просто УДАЛИЛ за ненадобностью. Так что QueryPerformanceCounter(&t2); считает просто время выполнения функции QueryPerformanceCounter;
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[11]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 10:07
Оценка: :)
Здравствуйте, catBasilio, Вы писали:

B>разобрался!!!

...
B>в случае с вектором он чесно заполняет массив двойками.
B>а функцию fun2 компилятор просто УДАЛИЛ за ненадобностью. Так что QueryPerformanceCounter(&t2); считает просто время выполнения функции QueryPerformanceCounter;

Точно, и это ОТЛИЧНО!
Re[13]: Инициализация массива при создании его через new
От: catBasilio  
Дата: 07.04.09 10:10
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>>В итоге, на таком искуственном (!!!) изгонении назница НОЛЬ. Но в рельности такое будет очень редко. Так что вектора это шит. И не надо его совать туда где он нахрен не нужен. !!!


А>Вектор в 4 раза быстрее == "назница НОЛЬ" для тебя? "Но в рельности такое будет очень редко. Так что вектора это шит" — шит потому, что

А>быстрее? Да ты индус! Тебя Кумар зовут?

Я на 2008 студии компилял при отключенной проверке выхода за границы разница 10%.
Но вообще рунтаймовая проверка выхода это очень полезно. Нельзя ее недооценивать. При том что для обычного массива выделенного по new можно запросто забыть позвать delete.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[13]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 10:15
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>>В итоге, на таком искуственном (!!!) изгонении назница НОЛЬ. Но в рельности такое будет очень редко. Так что вектора это шит. И не надо его совать туда где он нахрен не нужен. !!!


А>Вектор в 4 раза быстрее == "назница НОЛЬ" для тебя? "Но в рельности такое будет очень редко. Так что вектора это шит" — шит потому, что

А>быстрее? Да ты индус! Тебя Кумар зовут?

Ты что не понимаешь? Ноль это значит 0... Нет разнцы, нет в четыре раза. Понял? Разницы нет. И это ТОЛЬКО в этом примере. А так вектор в 36 раз медленее. Вектор это шит. Пора дебангалорить тех кто юзает вектора...
Re[7]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 10:20
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

S>>>хехе, но с другой стороны, вопрос о списке инициализации, так что массив предположительно небольшой, тогда зачем нужен new?


E>>В чём суть проблемы топикстартера я тоже не понимаю...

L_L>http://en.wikipedia.org/wiki/Troll_(Internet)

Код на столе, а вы где? ... Троль... хм, просто позорище.
Re[14]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 10:23
Оценка:
А>Ты что не понимаешь? Ноль это значит 0... Нет разнцы, нет в четыре раза. Понял? Разницы нет. И это ТОЛЬКО в этом примере. А так вектор в 36 раз медленее. Вектор это шит. Пора дебангалорить тех кто юзает вектора...
Кумар, успокойся. Мерять производительность твоих кретинских программ и кричать про шит начал ты сам. Держи себя в руках.
Re[8]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 10:24
Оценка:
Здравствуйте, Аноним, Вы писали:

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


S>>>>хехе, но с другой стороны, вопрос о списке инициализации, так что массив предположительно небольшой, тогда зачем нужен new?


E>>>В чём суть проблемы топикстартера я тоже не понимаю...

L_L>>http://en.wikipedia.org/wiki/Troll_(Internet)

А>Код на столе, а вы где? ... Троль... хм, просто позорище.

Мне тут помогли найти вашу фотку! Держите! http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Internet_Troll_velu_ill_artlibre_jnl.jpg
Of course, the code must be complete enough to compile and link.
Re[15]: Инициализация массива при создании его через new
От: Аноним  
Дата: 07.04.09 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>Ты что не понимаешь? Ноль это значит 0... Нет разнцы, нет в четыре раза. Понял? Разницы нет. И это ТОЛЬКО в этом примере. А так вектор в 36 раз медленее. Вектор это шит. Пора дебангалорить тех кто юзает вектора...

А>Кумар, успокойся. Мерять производительность твоих кретинских программ и кричать про шит начал ты сам. Держи себя в руках.

Я сам?! О... здесь
Автор: catBasilio
Дата: 07.04.09
а извиниться? Ну? Дущонкой слабоват? Ты же оказался не прав — почему же не признать?

Не тут явно — ЛНС.

Убого как-то всё у некоторых — слабаки дущой — нож в спину, кляузу, в троем одного... Это все-таки убого, а настоящие мужики — неправ — признаю, был не прав. Извини.

Батаники.
Re[16]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 10:32
Оценка:
А>Не тут явно — ЛНС.

А>Убого как-то всё у некоторых — слабаки дущой — нож в спину, кляузу, в троем одного... Это все-таки убого, а настоящие мужики — неправ — признаю, был не прав. Извини.


А>Батаники.


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

А>>Код на столе, а вы где? ... Троль... хм, просто позорище.

L_L>Мне тут помогли найти вашу фотку! Держите! http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Internet_Troll_velu_ill_artlibre_jnl.jpg

Ага — на этом, и остановимся.... ха-ха, убогие...


Мне кажется, вам пора остановиться.


Я не начинал ... Тролем, начали крутить ВЫ. И оказались не правы — и духу признать это не хватает, а хватает, только флеймить. Причем я считаю, что я то как раз веселиться имею право — я оказался прав.

На мой взгляд, способность признать собственные ошибки — говорит о силе человека, а не способность — говорит о слобости. Я вот всегда, без проблем признаю — если был не прав. В чем проблема.
Re[10]: Инициализация массива при создании его через new
От: Lorenzo_LAMAS  
Дата: 07.04.09 10:42
Оценка: +1
А>Я не начинал ... Тролем, начали крутить ВЫ. И оказались не правы — и духу признать это не хватает, а хватает, только флеймить. Причем я считаю, что я то как раз веселиться имею право — я оказался прав.

В том, что вы тролль — я не сомневаюсь и от слов своих не откажусь.
Давайте вы по пунктам приведете мои сообщения (кроме слов о троллях) и обоснуете, в чем я не прав. Подозреваю, что вы это не сделаете.

А>На мой взгляд, способность признать собственные ошибки — говорит о силе человека, а не способность — говорит о слобости. Я вот всегда, без проблем признаю — если был не прав. В чем проблема.


Не вам рассуждать об этом. В этом топике вы наделали кучу ошибок и ни одной не признали. С этого момента, я отвечаю на ваши последующие сообщения _только_ если вы аргументированно отвечаете на мои и не игнорируете вопросы.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.