当我使用 Visual Studio 2008 创建发布版本时,我遇到了一个奇怪的问题。我想知道你们是否可以帮助我了解发生了什么。
描述:我有一个类成员函数,它返回一个指向存储在类中的结构的指针:
const MyStruct * Myclass::getPointer() {
return mystruct_variable; // this is properly initialyzed
}
另一点值得指出的是,这个类/方法在一个 dll 中,我将它导出以在单独的可执行项目中使用。当我进行发布构建并尝试使用上述方法时,运行崩溃取决于是否内联 getPointer() 方法(即放置在类的头文件部分中)或没有(放置在 cpp 文件中)。
用法是:
const MyStruct * cf = myclassObj.getPointer();
int n = cf->size_t;
std::cout<<n<<std::endl;
当 MyClass::getPointer() 在标题中内联时,程序集如下所示:
const MyStruct * cf = myclassObj.getPointer();
012514A8 mov esi,dword ptr [ebx+794h]
int n =cf->size_t;
012514AE mov eax,dword ptr [esi+20h]
std::cout<<n<<std::endl;
012514B1 mov ecx,dword ptr [__imp_std::endl (1252038h)]
012514B7 push ecx
012514B8 mov ecx,dword ptr [__imp_std::cout (125203Ch)]
012514BE push eax
012514BF call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (1252048h)]
012514C5 mov ecx,eax
012514C7 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (1252044h)]
当 getPointer() 的类方法没有被内联,并放在相应的 cpp 文件中时,相同的代码给出:
const MyStruct * cf = myclassObj.getPointer();
00DA14A8 mov ecx,ebx
00DA14AA call dword ptr [__imp_MyClass::getPointer(0DA2104h)]
int n =cf->size_t;
std::cout<<n<<std::endl;
00DA14B0 mov ecx,dword ptr [__imp_std::endl (0DA2038h)]
00DA14B6 mov esi,eax
00DA14B8 mov eax,dword ptr [esi+20h]
00DA14BB push ecx
00DA14BC mov ecx,dword ptr [__imp_std::cout (0DA203Ch)]
00DA14C2 push eax
00DA14C3 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0DA2048h)]
00DA14C9 mov ecx,eax
00DA14CB call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0DA2044h)]
任何想法为什么这两个案例有不同的装配集?难道我做错了什么?谢谢!