假设我有这样一个结构体(一个POD):
struct Foo
{
int i;
double d;
};
以下两行代码有何不同:
这是什么意思?
Foo* f1 = new Foo;
Foo* f2 = new Foo();
假设我有这样一个结构体(一个POD):
struct Foo
{
int i;
double d;
};
这是什么意思?
Foo* f1 = new Foo;
Foo* f2 = new Foo();
第一个选项将值保留为未初始化状态;第二个选项将它们初始化为零。这仅适用于POD类型,这些类型没有构造函数。
我什么也不假设。即使没有意义,Foo()
也是允许的... 我试着将 struct
改为 class
并在生成的exe文件上进行了比较,结果相同,这意味着从实际和“有效”的角度来看,一个没有方法的类就像一个结构体。
但是:如果只使用其中一种选择,在保持不变的情况下,无论是struct
还是class
,它们都会产生不同的可执行文件! (至少使用g++)例如:
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo; delete f1; }
编译成了与下面的代码不同的内容:
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo(); delete f1; }
而且与struct
相比,class
也是一样的。要知道区别在哪里,我们应该看生成的代码... 要知道这是否是g++的特殊情况,我应该尝试另一个编译器,但我只有gcc,现在没有时间分析g++的汇编输出...
无论如何,从“功能”(实际)角度来看,都是一样的。
添加
最后,了解或深入研究一些常见的人类问题,可以在问答网站上进行... g++生成的代码在有()和无()的情况下唯一的区别是:
movl $0, (%eax) fldz fstpl 4(%eax)
这是一个片段,将结构体的整数和浮点数初始化为0/0.0... 所以Seymour更了解它(但如果我先看了汇编代码,我也可以发现它!)