gpt4 book ai didi

C++ - const 参数和类变量是悲观化的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:34:37 24 4
gpt4 key购买 nike

我正在尝试弄清楚在编写 C++ 代码时什么时候应该使用 const。这些都是悲观的例子还是这样写代码有好处?:

示例 1:

int findVal(const int OTHER_VAL) const
{
switch(OTHER_VAL)
{
case 1:
return 2;
default:
return 3;
}
}

示例 2:

enum class MobType
{
COW, CHICKEN, DOG, PIG
};

class BaseMob
{
protected:
BaseMob(const MobType TYPE) : TYPE(TYPE) { }

const MobType TYPE;
};

示例 3:

void showWorld(const World &world)
{
auto data = world.getData();
for (auto &i:data)
i.print();
}

最佳答案

不,他们不是。

const 具有自动存储(包括函数参数)的局部变量是纯粹的语法糖,可帮助人类程序员为其代码设置规则。它根本没有帮助优化器。优化编译器从 C 源代码中提取必要的数据移动,并对其进行优化。他们通常不关心您是否将同一个 tmp 变量重复用于许多不同的事情,或者在同一个函数中有 10 个不同的 const tmp1 = a+10;

是的,这适用于按值传递的函数参数;它们是具有自动存储功能的局部变量,通过寄存器或堆栈传递。不,这并不意味着调用者可以假设函数没有修改用于 arg 传递的堆栈内存,因此它也不会帮助优化器。 (使用相同的参数进行第二次函数调用仍然需要将参数重新写入堆栈(如果不是所有的参数都适合寄存器),因为参数上的 const 不会改变这样的事实被调用函数“拥有”该堆栈空间,并可以根据需要将其用作暂存空间。)


const 静态/全局/引用变量确实有帮助。 static const int foo = 10; 可以作为立即常量内联,而不是从内存中加载。 (例如,add eax, 10 而不是 add eax, [foo])。


Using const to mark a class method as not changing any class members还可以帮助编译器避免在函数调用后重新加载类成员。 (即让他们活在寄存器中)。这主要只适用于编译器看不到函数定义的情况,否则一个好的优化编译器可以只查看被调用函数的作用并相应地进行优化。 (只要它不是在 Unix 库中,符号插入意味着它不能假定它在编译时看到的调用函数将是动态链接后调用的函数。)

关于C++ - const 参数和类变量是悲观化的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37735209/

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