sizeof()
От: Аноним  
Дата: 13.09.07 06:16
Оценка:
добрый день.
вот возник такой вопрос.
Есть некий класс

class A
{
public:
    A(){}
    virtual ~A(){}

    void f(){}
    virtual void vf(){}
private:
    int      m_n;
    char    *m_p;
};
А а;

sizeof(a) = sizeof(int) + sizeof(char*) + vtable. и того 12.
но почему если в в классе заменить int на double то в sizeof(a) получим 24 вить разница должна быть 4 байта почему 12????

Исправлено форматирование. НИКОГДА не запихивайте длинный текст в блок [code]. — Кодт
Re: sizeof()
От: dupamid Россия  
Дата: 13.09.07 06:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>sizeof(a) = sizeof(int) + sizeof(char*) + vtable. и того 12.

А>но почему если в в классе заменить int на double то в sizeof(a) получим 24 вить разница должна быть 4 байта почему 12????

Для double лучше использовать выравнивание 8, поэтому получается так:
struct impl {
    void* vtable;
    char gap1[4];
    double d;
    char* p;
    char gap2[4]; 
};

А вообще это конечно же зависит от компилятора и ключей компиляции. Можешь сказать #pragma pack(4) перед структурой и все должно стать как ты хочешь, но производительность может быть хуже.
Re: sizeof()
От: MasterZiv СССР  
Дата: 13.09.07 06:37
Оценка:
Аноним 604 пишет:
> А а;
> sizeof(a) = sizeof(int) + sizeof(char*) + vtable. и того 12.
> но почему если в в классе заменить int на double то в sizeof(a) получим 24 вить разница должна быть 4 байта почему 12????

Выравнивание на границу слов или двойных слов. Отключается в компиляторе.
Posted via RSDN NNTP Server 2.1 beta
Re: sizeof()
От: Bell Россия  
Дата: 13.09.07 07:18
Оценка:
Здравствуйте, Аноним, Вы писали:


Если коротко: компилятор упаковывает члены не обязательно "вплотную" друг к другу — он руководствуется требованиями к выравниваню типов (allignment requirements). Воспользуйся поиском по форуму, если есть желание посмотреть подробности
Любите книгу — источник знаний (с) М.Горький
Re: размер на куче
От: Erop Россия  
Дата: 13.09.07 07:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>но почему если в в классе заменить int на double то в sizeof(a) получим 24 вить разница должна быть 4 байта почему 12????


Если поискать, например, фразу "что вернёт sizeof
Автор: Erop
Дата: 28.10.05
", то сразу и найдёшь...

Удачи...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.