是否有可能在编译时打印一个C ++类的大小?
是否有可能在编译时确定一个C ++类的大小?
我似乎记得一个模板元编程方法,但我可能会被误认为…
对不起,没有更清晰 – 我想要在生成输出窗口打印的大小
如果您确实需要在编译器输出中获取sizeof(X),则可以将其用作不完整模板types的参数:
template<int s> struct Wow; struct foo { int a,b; }; Wow<sizeof(foo)> wow; $ g++ -c test.cpp test.cpp:5: error: aggregate 'Wow<8> wow' has incomplete type and cannot be defined
要回答更新的问题 – 这可能是矫枉过正,但它会在编译时打印出你的类的大小。 在Visual C ++编译器中有一个未公开的命令行开关,它将显示类的完整布局,包括它们的大小:
该开关是/ d1reportSingleClassLayoutXXX,其中XXX执行与类名的子string匹配。
sizeof
什么问题? 这应该在对象和类上工作。
void foo( bar* b ) { int i = sizeof bar; int j = sizeof *b; // please remember, that not always i==j !!! }
编辑:
这是我想到的例子,但由于某种原因,它不工作。 谁能告诉我什么是错的?
#include <iostream> using namespace std; class bar { public: int i; bar( int ii ) { i = ii; } virtual ~bar(){ i = 0; } virtual void d() = 0; }; class bar2: public bar { public: long long j; bar2( int ii, long long jj ):bar(ii){ j=jj; } ~bar2() { j = 0; } virtual void d() { cout << "virtual" << endl; }; }; void foo( bar *b ) { int i = sizeof (bar); int j = sizeof *b; cout << "Size of bar = " << i << endl; cout << "Size of *b = " << j << endl; b->d(); } int main( int arcc, char *argv[] ) { bar2 *b = new bar2( 100, 200 ); foo( b ); delete b; return 0; }
该应用程序已在Linux(gcc 4.4.2)上运行:
[elcuco@pinky ~/tmp] ./sizeof_test Size of bar = 8 Size of *b = 8 virtual
sizeof()决定编译时的大小。
直到编译时才工作,所以你不能在预处理器中使用它。
另一个简单的代码技巧:
int dummy; switch (dummy) { case sizeof(dummy): case sizeof(dummy): break; }
——开始build立:项目:cpptest,configuration:Debug Win32 ——> cpptest.cpp c:\ work \ cpptest \ cpptest \ cpptest.cpp(33):error C2196:case value'4 ' 已使用
==========构build:0成功,1失败,0最新,0跳过==========
编辑:上面的dummy
是为了满足所需的语法切换条件的一些积分variables。 使用sizeof(X)
作为case常量:
这也适用于C代码。
struct X { int a,b; int c[10]; }; int _tmain(int argc, _TCHAR* argv[]) { int dummy; switch (dummy) { case sizeof(X): case sizeof(X): break; } return 0; }
——开始构build:项目:cpptest,configuration:debuggingWin32 —— cpptest.cpp c:\ work \ cpptest \ cpptest \ cpptest.cpp(29):error C2196:case value'48'已经使用==========构build:0成功,1失败,0最新,0跳过==========
这是一个产生警告而不是错误的版本:
/** Compile-time sizeof as a warning so compilation can continue */ struct TestStruct { int i1; float f1; const char* pchar1; double d1; char c1; void* pv1; bool b1; }; template<unsigned int n> struct PrintNum { enum { value = n }; }; template<int number> struct _{ operator char() { return number + 256; } }; #define PRINT_AS_WARNING(constant) char(_<constant>()) int main() { PRINT_AS_WARNING(PrintNum<sizeof(TestStruct)>::value); return 0; }
看到它在这里运行。 顺便说一下,你可以从大会上读出尺寸( 48
):
leaq -1(%rbp), %rax movq %rax, %rdi call _<48>::operator char() movl $0, %eax leave ret
有运算符sizeof( int )
, sizeof( char )
所以我认为这是可能的,并且可能看起来像sizeof( MyClass )
然而,另一个使VC ++ 2010编译器抱怨错误地使用编译时间整数的技巧:
// cpptest.cpp : Defines the entry point for the console application. // #include "stdafx.h" struct X { int a[11]; char c[2]; }; void proc1(void* s[1]) { } int _tmain(int argc, _TCHAR* argv[]) { int b[sizeof(X)]; proc1(b); return 0; }
1> ——build立开始:项目:cpptest,configuration:发布Win32 —— 1> cpptest.cpp 1> cpptest.cpp(14):错误C2664:'proc1':不能转换参数1从'int [48]'到'void * []'1>
指出的types是不相关的; 转换需要reinterpret_cast,C风格转换或函数风格转换==========生成:0成功,1失败,0最新,0跳过==========
因此,sizeof(struct X)是48.这也适用于C代码。
这是我使用的片段:
template <typename T> void get_sizeof() { switch (*((int*)0x1234)) { case sizeof(T): case sizeof(T):; } }
要获得大小,请在代码中的任何位置实例化函数,例如,在一个语句中:
struct S { long long int ill; }; get_sizeof<S>;
该错误将如下所示:
error: duplicate case value '8' switch (*((int*)0x1234)) { case sizeof(T): case sizeof(T):; } ^
这个macros是基于grep的答案。 定义如下的macros:
#define COMPILE_TIME_SIZEOF(t) template<int s> struct SIZEOF_ ## t ## _IS; \ struct foo { \ int a,b; \ }; \ SIZEOF_ ## t ## _IS<sizeof(t)> SIZEOF_ ## t ## _IS;
然后像这样使用它:
COMPILE_TIME_SIZEOF(long);
你会得到类似于下面的输出:
error: 'SIZEOF_long_IS<4> SIZEOF_long_IS' redeclared as different kind of symbol SIZEOF_ ## t ## _IS<sizeof(t)> SIZEOF_ ## t ## _IS;
仍然是一个解决方法,但很容易使用。