C++ C++;构造函数编译
我在编译构造函数时遇到问题,当我在VC6上编译程序时,我的构造函数有内存分配(sub esp,X),但当我在VC9上编译时,我的构造函数没有内存分配 谁知道问题出在哪里? 我认为这是项目设置中的问题,但我不知道在哪里 VC6(Visual Studio 6+SP3): VC9(Visual Studio 2008+SP1): 类别:C++ C++;构造函数编译,c++,decompiling,C++,Decompiling,我在编译构造函数时遇到问题,当我在VC6上编译程序时,我的构造函数有内存分配(sub esp,X),但当我在VC9上编译时,我的构造函数没有内存分配 谁知道问题出在哪里? 我认为这是项目设置中的问题,但我不知道在哪里 VC6(Visual Studio 6+SP3): VC9(Visual Studio 2008+SP1): 类别: class MyClass { public: MyClass(); virtual ~MyClass(); // --
class MyClass
{
public:
MyClass();
virtual ~MyClass();
// ----
BOOL Function1(LPSTR Arg1);
BOOL Function2(LPSTR Arg1);
BOOL Function3(LPSTR Arg1);
// ----
private:
char Member1[1000][20];
int Member2;
};
代码:
VC6和VC9上的代码相同
p.S.:
当需要使编译结果相同时,对同一代码进行不同编译时出现的问题
p.S.(2):
@greatwolf-我很确定问题不在VC6中,问题在项目设置中,但我不知道它在哪里。
目标-100%相同的汇编代码(字节到字节)。
在调试模式下投影到VC6和VC9上,但显然有不同的选项。上面的反汇编看起来完全没有优化。您看到的额外堆栈分配可能恰好是VC6在未优化构建中生成的样板代码 我建议将其构建为发布并再次检查拆卸。您可以放入内联程序集断点,以便更容易在调试器中找到:
MyClass::MyClass()
{
__asm { int 3 }
this->Member2 = 0;
}
并解释问题所在…此程序集是通过发布或调试配置生成的吗?请确保,您首先查看的是未经优化的汇编。您不会从两个不同的编译器获得相同的编译结果。否则他们不会有什么不同。NB成员初始化应该使用为此目的提供的语法,否则你要做两次。我认为更有趣的问题是(不是说它实际上很有趣):为什么VC 6在堆栈上分配了一堆它不需要或不使用的内存?@ausairman:我同意,我想知道为什么会发生这样的事情(即使答案是“没有特殊原因”)。然而,OP似乎表明这不仅仅是好奇,而且出于某种原因这是一个问题。我认为这个问题有一些背景知识来解释为什么它是一个问题是合理的。不需要调试器-只需使用
/FAsc
或类似选项,编译器就会为您生成汇编文件。@MichaelBurr是的,但是在一个优化的构建中,你可以预期汇编代码会非常混乱并且难以解释。通过上面的硬编码断点,你可以快速锁定目标位置。如果它是相同的汇编代码,为什么解释起来会或多或少困难呢?另外,我似乎记得微软的编译器关闭了op包含asm
块的函数中的计时。我不确定当前的编译器是否仍然如此,但如果您正在寻找优化的codegen,则可能会被asm
块击中。更不用说,即使源代码中看似微不足道的更改也可能导致意外的更改到codegen-请在上面的评论中查看我与一个关于泡泡运动问题的老SO问题的链接。@MichaelBurr非常有趣的一点!我没想到变量名称的更改会产生这样的影响。但公平地说,虽然代码中有UB,但几乎什么都没有。@greatwoelf:UB是导致这个家伙发布关于行为的问题的原因vior,但即使删除UB,基于不同变量名的codegen差异仍然存在。因此,真正的收获是,就codegen而言,只要它的行为符合规范,您就不能依赖任何特定的codegen(尽管如果需要,您可以抱怨其质量)。
MyClass::MyClass()
{
__asm { int 3 }
this->Member2 = 0;
}