Функция sizeof()

Пытаюсь вычислить, сколько места займёт мой объект в памяти компьютера. делаю так


#include <iostream>

using namespace std;

class someobject
{
    private:
        int somedata;
        double somedata2;
    public:
        void setdata()
        {
            cin >> somedata >> somedata2;
        }
        void displaydata()
        {
            cout << somedata << " " << somedata2;
        }
};

int main( int argv, char *argc[] )
{
    cout << sizeof(someobject);
    return 0;
}

но по неизвестным мне причинам выводится 16. Хотя насколько я знаю( я даже проверял той-же функцией sizeof() ) int занимает в памяти 4 байта, а double занимает 8 байт(в моей операционной системе). Что я не догоняю?

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

#include <iostream>
using namespace std;


class someclass
{
    public:
        int i;
        double s;
};

// Memory dump
// http://stackoverflow.com/questions/1286725/hex-dump-from-memory-location
void dump (const void * mem, unsigned int n)
{
  const char * p = reinterpret_cast< const char *>( mem );
  for ( unsigned int i = 0; i < n; i++ ) {
    std::cout << hex << int(p[i]) << " ";
  }
  std::cout << std::endl;
}

int main(int argv, char *argc[])
{
    someclass *o = new someclass();

    o->i = 10;
    o->s = 3.33;

    dump(&o, sizeof(o));
    return 0;
}

selevit, что то я не совсем понимаю, что показывает эта программа. Сначала мы передаём указатель на объект, а затем читаем область памяти, выделенную для этого объекта, так? Но тогда почему там даже мимоходом не упоминается число 10? А так же почему теперь объект занимает 4 байта в памяти( опять же sizeof() ) вместо 12 байт?

Свойства объекта в памяти не обязательно должны идти впритык друг к другу

чего то сейчас дошло, раз свойства в разных местах памяти, то и функция sizeof() не подходит? или как?

selevit, программка-то с ошибкой. Ты в dump() передаёшь адрес указателя на объект и размер (sizeof) указателя на объект.

Должно быть так:

#include <iostream>
using namespace std;

class someclass
{
    public:
        int i;
        double s;
};

// Memory dump
// http://stackoverflow.com/questions/1286725/hex-dump-from-memory-location
void dump (const void * mem, unsigned int n)
{
  const unsigned char * p = reinterpret_cast< const unsigned char *>( mem );
  for ( unsigned int i = 0; i < n; i++ ) {
    std::cout << hex << (unsigned int)(p[i]) << " ";
  }
  std::cout << dec << std::endl;
}

int main(int argv, char *argc[])
{
    someclass *o = new someclass();

    o->i = -1;
    o->s = 3.33;

    cout << "sizeof(int) = " << sizeof(int) << endl
        << "sizeof(double) = " << sizeof(double) << endl << endl;
    cout << "sizeof(*o) = " << sizeof(*o) << endl;
    dump(o, sizeof(*o));

    someclass o1;
    o1.i = -1;
    o1.s = 3.33;
    cout << "sizeof(o1) = " << sizeof(o1) << endl;
    dump(&o1, sizeof(o1));
    return 0;
}

Я ещё туда для проверки кусок с локальной переменной вставил и изменил инициализацию целого члена на -1, что бы были заполнены FF все байты, которые относятся к нему.

porshe, теперь результаты...

Вывод (Dev-C++ 5.5.3) получил такой (для разных компиляторов):

// TDM-GCC 4.7.1 32-bit Debug

sizeof(int) = 4
sizeof(double) = 8

sizeof(*o) = 16
ff ff ff ff c4 0 34 0 a4 70 3d a d7 a3 a 40
sizeof(o1) = 16
ff ff ff ff bf 8c 40 0 a4 70 3d a d7 a3 a 40


// TDM-GCC 4.7.1 64-bit Debug

sizeof(int) = 4
sizeof(double) = 8

sizeof(*o) = 16
ff ff ff ff 0 0 0 0 a4 70 3d a d7 a3 a 40
sizeof(o1) = 16
ff ff ff ff 0 0 0 0 a4 70 3d a d7 a3 a 40

Размер объекта — 16 байт.
Первые 4 байта занимает int i. Член double s занимает последние 8 байт. Он выровнен на границу 64-битного слова.
Т.е. между переменными класса получилась неиспользуемая «дыра» в 4 байта.
Выравнивание по границе 64-разрядного слова делается компилятором для более быстрого обращения к этой области памяти.

А вот для такого класса:

class someclass
{
    public:
        int i;
        int ii;
        double s;
};

с инициализацией члена ii значением 0xeeeeeeee, вывод будет таким:

sizeof(int) = 4
sizeof(double) = 8

sizeof(*o) = 16
ff ff ff ff ee ee ee ee a4 70 3d a d7 a3 a 40
sizeof(o1) = 16
ff ff ff ff ee ee ee ee a4 70 3d a d7 a3 a 40

А для такого:

class someclass
{
    public:
        int i;
        double s;
        int ii;
};

вывод будет таким:

sizeof(int) = 4
sizeof(double) = 8

sizeof(*o) = 24
ff ff ff ff 0 0 0 0 a4 70 3d a d7 a3 a 40 ee ee ee ee 6c 65 73 0
sizeof(o1) = 24
ff ff ff ff 0 0 0 0 a4 70 3d a d7 a3 a 40 ee ee ee ee 0 0 0 0

Чудеса? ;-)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.