我知道结构的大小在编译时是已知的,因此应该可以在编程期间找到结构的大小。我怎么能这样做?
更具体一点:
我有一个结构说:
struct mystruct
{
int a;
char b;
float c[100];
}
我可以在我的代码中编写这一行并运行应用程序并查看此结构的大小:
int size=sizeof(mystruct);
cout<<"size is="<<size<<endl;
但这涉及到我的应用程序添加一些代码并运行它。
Visual Studio IDE有没有办法帮助我找到这个结构的大小(例如将光标放在它上面并按下一个键!)
答案 0 :(得分:4)
Intellisense可以告诉你这个。例如:
template <size_t S> class Sizer { };
int x;
Sizer<sizeof(x)> foo;
如果您将鼠标悬停在foo
上,则会显示4Ui64
- x
的大小为4. Ui64
后缀是因为size_t
是无符号的,积分和64位。由于它使用Intellisense,因此您无需编译代码。您可以将Sizer
放入stdafx.h
预编译标题中。
答案 1 :(得分:3)
给定类型T,写下以下内容:
constexpr size_t sizeOfT = sizeof(T);
鼠标悬停在sizeOfT
上,您将看到结构的大小为此constexpr的值。
答案 2 :(得分:2)
因此,要让编译器显示大小,您可以使用编译器的错误消息,例如:
template <size_t N> struct helper_size; // undefined.
然后放在代码中的某个地方
helper_size<sizeof (mystruct)>::type h;
我收到的错误消息是:
gcc: error: specializing member 'helper_size<408u>::type' requires 'template<>' syntax
visual 2013: error C2027: use of undefined type 'helper_size<408>'
您有预期的408
值。
答案 3 :(得分:1)
这是一个有用的技巧,简短易懂:
int a[sizeof(std::string)] = 0;
编译器会说:不能从'int'转换为'int [24]'。这是邮件中您的尺寸24
。
该技术使用了与编译器无关的事实,即在堆栈上创建的恒定大小的数组具有自己的类型,其签名包括数组大小。但是g++
抛出一个“必须使用大括号括起来的初始化程序初始化消息” 消息,因此必须使用一些修改后的版本来破解它:
int a[sizeof(std::string)];
a = 0;
错误:将“ int”分配给“ int [32]”
的类型不兼容(糟糕,编译器之间的std :: string大小确实有所不同)
答案 4 :(得分:0)
我不认为VS中有这样的选择(或者我没有被告知)。虽然您可以使用以下方法自行计算:http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
答案 5 :(得分:0)
但这涉及到我的应用程序添加一些代码。
除了jarod的评论:
How to: Watch an Expression in the Debugger
About debugger Expressions in Native C++
并且跑步
不幸的是,您应该将代码应用到您的应用程序中。但是在c ++ 11中你可以静态断言,它将是干净的方法加上它由语言本身提供: static-assert-with-sizeof