2011-02-26 70 views
4

我正在阅读Modern C++设计。关于作业人员的大小,如下所述被记载。以下段落从泛型编程的角度进行了解释。关于C++中sizeof运算符的功能

sizeof有一个惊人的功能:无论多么复杂,您都可以将sizeof应用于任何表达式,并且sizeof返回其大小,而无需在运行时实际评估该表达式。这意味着sizeof意识到重载,模板实例化,转换规则 - 所有可以参与C++表达式的东西。实际上,sizeof隐藏了推导表达式类型的完整工具;最终,sizeof抛出表达式并仅返回其结果的大小。

我的问题是作者是什么意思sizeof返回其大小与实际评估在运行时的展望。并且在最后一行中提到sizeof抛出表达式。请求帮助理解这些陈述,如果它是用示例完成的话,那将是很好的。

由于

+0

想想表达式中的“i ++”或函数/方法调用; 'sizeof'显然不会执行那些跟踪类型的报告结果的大小。我从来不知道C++'sizeof'太强大了:)谢谢! – sarnold 2011-02-26 11:08:15

+0

这篇文章可能会帮助你http://stackoverflow.com/questions/671790/how-does-sizeofarray-work – 2011-02-26 11:12:33

+0

我想这就是为什么'decltype'是第一个C++ 0x可用,因为机制已经可用无论如何:) – 2011-02-26 12:45:43

回答

2

作者指的是什么意思sizeof返回它的大小与实际评估在运行时的展望。

这意味着sizeof(1/0)将产生sizeof(int),即使1/0通常会中止该程序,因为被零除是运行时错误。此外,对于任何p声明为T* p,sizeof(*p)将产生sizeof(T)无论存储在p什么值,即使p悬而未决或根本没有初始化。

1

以下给出您i++具有类型,这是int的的sizeof(通常一个int具有4或8个字节,所以它可能会给你值4或8)。但是,由于不评估表达式,因此不会对表达式执行任何运行时操作。

int i = 0; 
sizeof(i++); 

评估表达式基本上意味着在运行时执行其副作用(例如递增变量)或读取内存或寄存器中的值。因此,从某种意义上说,sizeof“抛弃”它的操作数,因为它没有真正执行它指定的运行时操作(i的值仍然为零)。

0

编译器需要计算各种操作的类型/结构体/类的大小。 sizeof运算符将这些大小作为常量提供给程序。举例来说,如果你做sizeof(int)编译器知道int是多大(以字节为单位),并且会插入该值。这同样适用于更复杂的东西,如sizeof(myVariable)myVariable的类型为MyClass:编译器确实知道MyClass占用了多少空间,因此可以插入该值。

问题是,此评估发生在编译时:结果是一个数字。在运行期间,评估不需要再次完成。

2

sizeof在编译时被评估:在编译器计算下面的操作者sizeof的表达式的类型。这是由编译器完成一劳永逸,因此句子“没有在运行时实际上对表达式”

编译器计算类型,则它能够从类型推导出表达式的大小,然后,仍然在编译时,整个sizeof表达由所计算出的大小替换。所以表达式本身并没有将它变成可执行代码。这就是句子“的sizeof扔掉的表达,并只返回其结果的大小”手段。

0

这意味着int j=sizeof(int);会被编译为int j=4;

我看过编译的程序集,在执行过程中没有实际计算的!

+1

这是错误的,至少部分。 'sizeof(int)'不总是4,它是平台相关的;此外,不应将结果分配给“int”,而应分配给“size_t”变量。 – 2011-04-30 09:48:56