Здравствуйте, Tora-Bora, Вы писали:
TB>void* MyClass::operator new[](size_t sz) TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
Потому что:
1. Компилятор мог выровнять поля класса (см. ключ /Zp)
2. CRT-шный аллокатор выравнивает блоки памяти в куче
[ posted via RSDN@Home 1.1.4 beta 3 r209, accompanied by Cherry Poppin' Daddies — Saddest Thing I Know ]
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, Tora-Bora, Вы писали:
TB>>void* MyClass::operator new[](size_t sz) TB>>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
SDB>Потому что: SDB>1. Компилятор мог выровнять поля класса (см. ключ /Zp) SDB>2. CRT-шный аллокатор выравнивает блоки памяти в куче
Ну не знаю, у меня он просто добваляет 4 байта, например:
Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание
Размер класса 4 кол-во эл-тов 4 size_t = 20;
Размер класса 8 кол-во эл-тов 4 size_t = 36;
Re[3]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Tora-Bora, Вы писали:
TB>Ну не знаю, у меня он просто добваляет 4 байта, например: TB>Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание TB>Размер класса 4 кол-во эл-тов 4 size_t = 20; TB>Размер класса 8 кол-во эл-тов 4 size_t = 36;
Если это отладочная сборка, то можно посмотреть здесь
Здравствуйте, Tora-Bora, Вы писали:
TB>Ну не знаю, у меня он просто добваляет 4 байта, например: TB>Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание TB>Размер класса 4 кол-во эл-тов 4 size_t = 20; TB>Размер класса 8 кол-во эл-тов 4 size_t = 36;
Ключевое слово выделено.
Дайте информацию о вашей версии компилятора, опциях компиляции; приведите код класса.
Иначе это гадание на кофейной гуще.
Все, что здесь сказано, может и будет использоваться против меня...
Re[4]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Alex Reyst, Вы писали:
AR>Здравствуйте, Tora-Bora, Вы писали:
TB>>Ну не знаю, у меня он просто добваляет 4 байта, например: TB>>Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание TB>>Размер класса 4 кол-во эл-тов 4 size_t = 20; TB>>Размер класса 8 кол-во эл-тов 4 size_t = 36;
AR>Ключевое слово выделено.
AR>Дайте информацию о вашей версии компилятора, опциях компиляции; приведите код класса. AR>Иначе это гадание на кофейной гуще.
Здравствуйте, Tora-Bora, Вы писали:
TB>void* MyClass::operator new[](size_t sz) TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
Вот мне сейчас знакомый ответил, что там в начале блока хранится размер.
Re[5]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Alex Reyst, Вы писали:
E>>Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.
AR>Уберите из вышеприведенного кода явно прописанный деструктор. Никаких лишних байтов не останется (VS 7.1)
Да. И как из этого следует то, что Вы написали выше?
Re[8]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Alex Reyst, Вы писали:
AR>Уберите из вышеприведенного кода явно прописанный деструктор. Никаких лишних байтов не останется (VS 7.1)
А ты чего хотел? Если не прописать деструктор то он будет тривиальным и как следствие его вызывать не обязательно... вот оптимизатор и соптимизировал.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, elcste, Вы писали:
E>Здравствуйте, Alex Reyst, Вы писали:
AR>>Добавляется место для хранения адреса деструктора ~TC.
E>Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.
А если я не дам этих 4-х байт? Ну то-есть верну на 4 байта меньше чем он требует?
Re[3]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Tora-Bora, Вы писали:
TB>Здравствуйте, SchweinDeBurg, Вы писали:
SDB>>Здравствуйте, Tora-Bora, Вы писали:
TB>>>void* MyClass::operator new[](size_t sz) TB>>>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
SDB>>Потому что: SDB>>1. Компилятор мог выровнять поля класса (см. ключ /Zp) SDB>>2. CRT-шный аллокатор выравнивает блоки памяти в куче
TB>Ну не знаю, у меня он просто добваляет 4 байта, например: TB>Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание TB>Размер класса 4 кол-во эл-тов 4 size_t = 20; TB>Размер класса 8 кол-во эл-тов 4 size_t = 36;
Может хранится длина запрошенного блока.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Почему operator new[] требует на 4 байта больше чем нужн
Здравствуйте, Tora-Bora, Вы писали:
TB>void* MyClass::operator new[](size_t sz) TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
Потому что (в данной реализации) кроме собственно массива в этом блоке памяти размещается информация о размере.
Ведь выражение delete[] pMyClassArray должно откуда-то эти сведения надыбать, чтобы выполнить правильное количество конструкторов,
вне зависимости от того, как гранулируется куча (т.е. пользоваться функциями наподобие _msize(void*) и т.п. нельзя).
В том случае, если эти 4 байта действительно создают проблемы — нужно отказаться от динамических массивов new T[n] / delete[] pT вообще.
И использовать, например, vector<T> или самописные инструменты.
Перекуём баги на фичи!
Re: Почему operator new[] требует на 4 байта больше чем нужн
Здравствуйте, Tora-Bora, Вы писали:
TB>void* MyClass::operator new[](size_t sz) TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
delete[] должен вызвать деструкторы всех элементов массива,
откуда ему знать размер этого массива?
в случае пустого деструктора этого не требуется.
Re[8]: Почему operator new[] требует на 4 байта больше чем н
Здравствуйте, Tora-Bora, Вы писали:
TB>А если я не дам этих 4-х байт? Ну то-есть верну на 4 байта меньше чем он требует?
Очевидно, в лучшем случае схватишь access violation при обращении к последнему элементу массива. В худшем случае — трудноуловимые глюки из-за перезаписи последним элементом какого-нибудь другого массива, объекта или служебной информации.