размер эекземпляра пустого класса
От: Аноним  
Дата: 02.02.08 17:33
Оценка:
#include <iostream>

class c{
};


int main() {
    std::cout << sizeof(c) << std::endl;
    return 0;
}


out: 1

откуда 1 байт взялся?
платформа MS Visual 2003
Re: размер эекземпляра пустого класса
От: primsasha  
Дата: 02.02.08 17:37
Оценка:
посмотри
http://www.cantrip.org/emptyopt.html
Re: размер эекземпляра пустого класса
От: ilnar Россия  
Дата: 02.02.08 17:57
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>#include <iostream>

А>class c{
А>};


А>int main() {
А>    std::cout << sizeof(c) << std::endl;
А>    return 0;
А>}

А>


А>out: 1


А>откуда 1 байт взялся?

А>платформа MS Visual 2003

из определения что разные объекты класса должные иметь разные адреса
Re: размер эекземпляра пустого класса
От: VoidEx  
Дата: 02.02.08 19:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>откуда 1 байт взялся?

А>платформа MS Visual 2003

Если мне не изменяет память, то экзепляр такого класса в качестве члена в другом классе может не занимать места. Т.е.

class my
{
public:
  int x;
  empty y;
};

// sizeof(my) == sizeof(int)
Re: размер эекземпляра пустого класса
От: Аноним  
Дата: 02.02.08 19:58
Оценка:
это фейковый размер. нужен только для того, чтобы были возможны подобные конструкции:


#include <iostream>

class c{
    public:    
        c() { std::cout << "c";}
};    


int main() {
    std::cout << sizeof(c) << std::endl;
    c ac[10];
    
    return 0;
}
Re: размер эекземпляра пустого класса
От: MasterZiv СССР  
Дата: 03.02.08 11:58
Оценка:
Аноним 217 пишет:

> откуда 1 байт взялся?


Размер любого объекта программы на С++ по стандарту не может быть меньше 1 байта
(точнее одного идентифицируемого на данной платформе элемента памяти). Это
связано с тем, что никакие два разных объекта не могут иметь одинаковые адреса.
Если размер объекта был бы 0, то в массиве таких объектов все элементы имели
бы одинаковый адрес, а это недопустимо.

Если же этот твой объект вложить в другой объект, он там уже может и не
занимать места, если ты его не адресуешь. Если адресуешь, то опять будет
занимать как минимум байт, чтобы его адрес был бы отличен от адреса соседнего
мембера.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: размер эекземпляра пустого класса
От: AlexCrush Россия  
Дата: 03.02.08 18:09
Оценка: :)
Здравствуйте, MasterZiv, Вы писали:

MZ>Если же этот твой объект вложить в другой объект, он там уже может и не

MZ>занимать места, если ты его не адресуешь. Если адресуешь, то опять будет
MZ>занимать как минимум байт, чтобы его адрес был бы отличен от адреса соседнего
MZ>мембера.

Как так? Откуда компилятор знает, адресую я мембер или нет?

Пример:

emptyClass.h:
class empty{};

struct containsEmpty
{
  empty e; //пустой член
  char c;  //нормальный член
  void someFunc();
};


emptyClass.cpp:
void containsEmpty::someFunc()
{
  void * ptr1 = &e;//поадресовали
  void * ptr2 = &c;//поадресовали
  printf("%d", sizeof(containsEmpty)); //должно быть не менее sizeof(char) + 1 (для "поадресованного" e)
}


somewhere.cpp:
#include "emptyClass.h"
//не поадресовали
void someClass::someOtherFunc()
{
  printf("%d", sizeof(containsEmpty)); //должно быть не менее sizeof(char) + 0(???) (для "непоадресованного" e)
}


То есть в ед.трансл. emptyClass.cpp мы обращались к e, там всё как-бы ясно, адреса у e и c должны отличаться.
А в ед.трансл somewhere.cpp мы к е не обращались, при её компиляции компилятор явно не в курсе, что е — адресуется. Каков будет результат?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.