gpt4 book ai didi

c++ - 使用 get 方法或成员直接访问值?

转载 作者:行者123 更新时间:2023-11-28 06:43:27 24 4
gpt4 key购买 nike

class SomeClass
{
int classMember;
public:
int GetMember();
bool IsPositive();
};

int SomeClass::GetMember()
{
return classMember;
}

bool SomeClass::IsPositive()
{
int val = GetMember(); //Case#1. Accessing value using get method
int val = classMember; //Case#2. Accessing value directly

return (val > 0);
}

问题:使用 Case#1 是否比 Case#2 有任何优势,反之亦然?与直接使用成员相比,使用 get 方法是否有任何开销(甚至是最小的开销)?

最佳答案

答案是,这实际上取决于您的编译器如何选择做某事。查看是否存在差异的最佳方法是查看反汇编。

    int val = classMember;
010C4869 mov eax,dword ptr [this]
010C486C mov ecx,dword ptr [eax]
010C486E mov dword ptr [val],ecx

return val > 0;
010C4871 cmp dword ptr [val],0
010C4875 jle SomeClass::IsPositiveClassMember+20h (010C4880h)
010C4877 mov dword ptr [ebp-4],1
010C487E jmp SomeClass::IsPositiveClassMember+27h (010C4887h)
010C4880 mov dword ptr [ebp-4],0
010C4887 mov al,byte ptr [ebp-4]

对比

    int val = GetMember();
010C4829 mov ecx,dword ptr [this]
010C482C call SomeClass::GetMember (010C1168h)
010C4831 mov dword ptr [val],eax

return val > 0;
010C4834 cmp dword ptr [val],0
010C4838 jle SomeClass::IsPositiveGetMember+23h (010C4843h)
010C483A mov dword ptr [ebp-4],1
010C4841 jmp SomeClass::IsPositiveGetMember+2Ah (010C484Ah)
010C4843 mov dword ptr [ebp-4],0
010C484A mov al,byte ptr [ebp-4]

第二个示例调用了 SomeClass::GetMember,它有自己的反汇编。所以在第二种情况下,它不只是从成员加载值,而是进行函数调用。

    return classMember;
010C4817 mov eax,dword ptr [this]
010C481A mov eax,dword ptr [eax]

您会注意到用 classMember 的值加载 val 的指令是相同的,因此开销来自 Call SomeClass::GetMember

然而,这是在 debug 模式下,没有优化。如果我们优化并在发布中构建,我们会看到以下反汇编:

    int val = classMember;

return val > 0;
013D4830 xor eax,eax
013D4832 cmp dword ptr [ecx],eax
013D4834 setg al

对比

    int val = GetMember();

return val > 0;
013D4820 xor eax,eax
013D4822 cmp dword ptr [ecx],eax
013D4824 setg al

编译器优化了调用,没有区别。

关于c++ - 使用 get 方法或成员直接访问值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com