是否有可能在编译时打印一个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匹配。

http://blogs.msdn.com/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx

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; 

仍然是一个解决方法,但很容易使用。