Почему operator new[] требует на 4 байта больше чем нужно?
От: Tora-Bora  
Дата: 06.11.04 07:45
Оценка:
void* MyClass::operator new[](size_t sz)
собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).
Re: Почему operator new[] требует на 4 байта больше чем нужн
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 06.11.04 08:05
Оценка:
Здравствуйте, 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 ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: Почему operator new[] требует на 4 байта больше чем н
От: Tora-Bora  
Дата: 06.11.04 08:29
Оценка:
Здравствуйте, 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 байта больше чем н
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 06.11.04 08:37
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>Ну не знаю, у меня он просто добваляет 4 байта, например:

TB>Размер класса 1 кол-во эл-тов 3 size_t = 7; // не похоже на выравнивание
TB>Размер класса 4 кол-во эл-тов 4 size_t = 20;
TB>Размер класса 8 кол-во эл-тов 4 size_t = 36;

Если это отладочная сборка, то можно посмотреть здесь
Автор(ы): Александр Шаргин
Дата: 27.01.2002
.
[ posted via RSDN@Home 1.1.4 beta 3 r209, accompanied by The Meteors — No Way Out ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: Почему operator new[] требует на 4 байта больше чем н
От: Alex Reyst Россия  
Дата: 06.11.04 08:38
Оценка:
Здравствуйте, 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 байта больше чем н
От: Tora-Bora  
Дата: 06.11.04 08:52
Оценка:
Здравствуйте, 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>Иначе это гадание на кофейной гуще.


class TC
{
    int i;
public:
    TC(void){}
    ~TC(void){}
    void* operator new[](size_t sz)
    {
        std::cout << "Size: " << sz << std::endl;
        return NULL;        
    }
};


void main()
{
    TC *pTC = new TC[4];
}

Компилятор VC 7.0.9466,
опции компиляции в debug:
/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
опции компиляции в release:
/O2 /Ob1 /Oy /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /GF /FD /EHsc /ML /GS /Gy /Fo"Release/" /Fd"Release/vc70.pdb" /W3 /nologo /c /Wp64 /Zi /TP
результат один и тот-же
Re: Почему operator new[] требует на 4 байта больше чем нужн
От: Tora-Bora  
Дата: 06.11.04 09:10
Оценка: +1 -1
Здравствуйте, Tora-Bora, Вы писали:

TB>void* MyClass::operator new[](size_t sz)

TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).

Вот мне сейчас знакомый ответил, что там в начале блока хранится размер.
Re[5]: Почему operator new[] требует на 4 байта больше чем н
От: Alex Reyst Россия  
Дата: 06.11.04 09:16
Оценка:
Добавляется место для хранения адреса деструктора ~TC.
Все, что здесь сказано, может и будет использоваться против меня...
Re[6]: Почему operator new[] требует на 4 байта больше чем н
От: elcste  
Дата: 06.11.04 09:33
Оценка: +1
Здравствуйте, Alex Reyst, Вы писали:

AR>Добавляется место для хранения адреса деструктора ~TC.


Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.
Re[7]: Почему operator new[] требует на 4 байта больше чем н
От: Alex Reyst Россия  
Дата: 06.11.04 09:38
Оценка:
Здравствуйте, elcste, Вы писали:

E>Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.


Уберите из вышеприведенного кода явно прописанный деструктор. Никаких лишних байтов не останется (VS 7.1)
Все, что здесь сказано, может и будет использоваться против меня...
Re[8]: Почему operator new[] требует на 4 байта больше чем н
От: elcste  
Дата: 06.11.04 09:45
Оценка:
Здравствуйте, Alex Reyst, Вы писали:

E>>Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.


AR>Уберите из вышеприведенного кода явно прописанный деструктор. Никаких лишних байтов не останется (VS 7.1)


Да. И как из этого следует то, что Вы написали выше?
Re[8]: Почему operator new[] требует на 4 байта больше чем н
От: WolfHound  
Дата: 06.11.04 10:11
Оценка:
Здравствуйте, Alex Reyst, Вы писали:

AR>Уберите из вышеприведенного кода явно прописанный деструктор. Никаких лишних байтов не останется (VS 7.1)

А ты чего хотел? Если не прописать деструктор то он будет тривиальным и как следствие его вызывать не обязательно... вот оптимизатор и соптимизировал.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Почему operator new[] требует на 4 байта больше чем н
От: Alex Reyst Россия  
Дата: 06.11.04 10:12
Оценка: :)
Вы правы. Наставьте мне минусов
Все, что здесь сказано, может и будет использоваться против меня...
Re[7]: Почему operator new[] требует на 4 байта больше чем н
От: Tora-Bora  
Дата: 06.11.04 11:57
Оценка:
Здравствуйте, elcste, Вы писали:

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


AR>>Добавляется место для хранения адреса деструктора ~TC.


E>Это такая особенность VC7.0? Дело в том, что VC6.0 и VC7.1 хранят там количество элементов в массиве.


А если я не дам этих 4-х байт? Ну то-есть верну на 4 байта меньше чем он требует?
Re[3]: Почему operator new[] требует на 4 байта больше чем н
От: LaptevVV Россия  
Дата: 06.11.04 12:03
Оценка:
Здравствуйте, 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 байта больше чем нужн
От: Кодт Россия  
Дата: 06.11.04 12:36
Оценка: +1
Здравствуйте, 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 байта больше чем нужн
От: vdimas Россия  
Дата: 06.11.04 22:30
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>void* MyClass::operator new[](size_t sz)

TB>собственно вопрос почему sz на 4 байта больше чем sizeof(MyClass)*(кол-во элементов).

delete[] должен вызвать деструкторы всех элементов массива,
откуда ему знать размер этого массива?

в случае пустого деструктора этого не требуется.
Re[8]: Почему operator new[] требует на 4 байта больше чем н
От: Centaur Россия  
Дата: 07.11.04 08:41
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>А если я не дам этих 4-х байт? Ну то-есть верну на 4 байта меньше чем он требует?


Очевидно, в лучшем случае схватишь access violation при обращении к последнему элементу массива. В худшем случае — трудноуловимые глюки из-за перезаписи последним элементом какого-нибудь другого массива, объекта или служебной информации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.