Получение размера переменной-члена
Если существует структура POD с некоторыми переменными-членами, например:
struct foo
{
short a;
int b;
char c[50];
// ...
};
Есть ли способ получить размер переменной-члена в байтах, не создавая объект этого типа?
Я знаю, что это сработает:
foo fooObj;
std::cout << sizeof( fooObj.a ) << std::endl;
std::cout << sizeof( fooObj.b ) << std::endl;
std::cout << sizeof( fooObj.c ) << std::endl;
Будет ли оптимизировано компилятором следующее и предотвратить конструкцию объекта?
std::cout << sizeof( foo().a ) << std::endl;
Ответы
Ответ 1
5.3.3/1:
Оператор sizeof дает число байтов в представлении объекта его операнда. Операнд либо выражение , которое не оценивается, или идентификатор типа в скобках.
Вышеизложенное означает, что следующая конструкция хорошо определена:
sizeof( ((foo *) 0)->a);
Ответ 2
Вы можете сделать это в С++ 0x:
sizeof(foo::a);
Ответ 3
Используйте эту форму: sizeof(foo::a)
.
Ответ 4
Используйте очевидное:
sizeof( foo::a )
В С++ sizeof ВСЕГДА оценивается во время компиляции, поэтому стоимость выполнения не существует.
Ответ 5
С++ - 0x позволяет это сделать:
std::cout << sizeof( foo::a ) << std::endl;
std::cout << sizeof( foo::b ) << std::endl;
std::cout << sizeof( foo::c ) << std::endl;
С++ - 0x позволяет sizeof работать с членами классов без явного объекта.
Статья находится здесь: Расширение sizeof для применения к нестатическим элементам данных без объекта (версия 1)
Я видел сообщение об этом выше слишком поздно. К сожалению.
Ответ 6
Вы можете создать оболочку макроса того, что предложил @Erik:
#define SIZE_OF_MEMBER(cls, member) sizeof( ((cls*)0)->member )
И затем используйте его как:
cout << SIZE_OF_MEMBER(foo, c) << endl;
Вывод:
50
Демо: http://www.ideone.com/ZRiMe
Ответ 7
struct foo
{
short a;
int b;
char c[50];
// ...
static const size_t size_a = sizeof(a);
static const size_t size_b = sizeof(b);
static const size_t size_c = sizeof(c);
};
Использование:
foo::size_a