Так как в C ++ sizeof
пустого класса — 1 байт, допустим ли следующий код?
class A
{
};
int main()
{
A a;
char* p = reinterpret_cast<char*>(&a);
*p = 'a';
}
Я знаю, что это в значительной степени бесполезно, но просто хотел посмотреть, смогу ли я это сделать. Он компилируется и отлично работает на MSVC2010.
Стандарт C ++ 03 1.8. Объектная модель C ++:
Соответствующие части § 1: An объект это область хранения … Некоторые объекты полиморфный… Для других объектов, Интерпретация найденных значений определяется типом выражений, используемых для доступа к ним.«
В вашем примере a
является объектом с автоматической продолжительностью хранения, который освобождается, когда выполнение покидает область действия. По сути, память, где она находится, доступна вам, и вы можете хранить там все, что захотите:
int i;
char* myStr = reinterpret_cast<char*>(&i);
myStr[0] = 'H';
myStr[1] = 'i';
myStr[2] = '!';
myStr[3] = '\0';
std::cout << myStr;
(Полный пример Вот)
Здесь вы должны учитывать время жизни объекта, которым вы «злоупотребляете» таким образом, то есть, если вы по-прежнему сохраняете указатель на эту память даже после того, как объект был освобожден, доступ к этой памяти приведет к неопределенное поведение.
Просто отметьте, что если язык позволяет вам что-то делать, это не значит, что вы должны это делать. Используйте функции этого языка так, как они должны были быть использованы. В конце концов, вы не пишете коды только для того, чтобы «это работало».
И на ваш вопрос о размере пустого класса, та же часть стандарта также говорит:
§ 4: Если законченный объект, элемент данных (9.2) или элемент массива имеют тип класса, его тип считается самый производный класс, отличить его от типа класса любого подобъекта базового класса; объект самого производного типа класса называется самый производный объект.
§ 5: Если это не битовое поле (9.6), наиболее производный объект должен иметь ненулевой размер и занимать один или несколько байтов памяти. Подобъекты базового класса могут иметь нулевой размер. Объект типа POD (3.9) должен занимать непрерывные байты памяти.
Таким образом, по стандарту гарантируется, что объекты пустого класса, такие как ваш, будут занимать не менее 1 байта.
Других решений пока нет …