【发布时间】:2010-06-01 16:38:23
【问题描述】:
假设我有一个看起来像这样的结构(一个 POD):
struct Foo
{
int i;
double d;
};
以下两行有什么区别:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
【问题讨论】:
标签: c++ constructor initialization default
假设我有一个看起来像这样的结构(一个 POD):
struct Foo
{
int i;
double d;
};
以下两行有什么区别:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
【问题讨论】:
标签: c++ constructor initialization default
第一个未初始化值;第二个将它们初始化为零。这仅适用于没有构造函数的 POD 类型。
【讨论】:
我想什么都没有。 Foo() 是允许的,即使它没有任何意义...我尝试将 struct 更改为 class 并尝试对生成的 exe 进行比较,结果是相同的,这意味着没有从实用和“有效”的角度来看,方法就像一个结构。
但是:如果你只使用一个的替代方案,不管struct或class,new Foo和new Foo()会给出不同的可执行文件! (至少使用 g++)即
被编译成不同于
的东西 结构 Foo { int i;双 d; } int main() { Foo *f1 = new Foo();删除 f1; }同样的情况发生在class 而不是struct。要知道区别在哪里,我们应该查看生成的代码......并且要知道它是否是 g++ 特质,我应该尝试另一个编译器,但我只有 gcc,现在没有时间分析 g++ 的 asm 输出。 ..
无论如何,从“功能”(实用)的角度来看,都是一样的。
添加
最后,最好了解或对问答网站上的一些常见人为问题进行更深入的调查...... g++ 在 () 和 no () 情况下生成的代码的唯一区别,
移动 $0, (%eax) 佛罗里达州 fstpl 4(%eax)这是一个片段,它将结构的 int 和 double 初始化为 0/0.0...所以 Seymour 更了解它(但我本可以在不知道是否先查看 asm 的情况下发现它!)
【讨论】:
【讨论】: