gpt4 book ai didi

c++ - 不鼓励在 C++ 中使用常量吗?

转载 作者:可可西里 更新时间:2023-11-01 16:36:28 25 4
gpt4 key购买 nike

style guide对我有用,但我遇到了规则 #5:

In general, the use of such constants should be minimized. In many cases implementing the value as a method is a better choice:

int getMaxIterations() // NOT: MAX_ITERATIONS = 25
{
return 25;
}

我从风格的角度理解原因:您不仅取消了“大喊大叫”的常量声明,而且还减少了使用的语言结构的数量(原谅我如果这是不正确的术语),使程序更容易理解。

但是,这种方法是否会对编译器产生负面影响,或者现代编译器(或者,事实上,旧编译器..)是否能够足够前瞻以确定您的 getMaxIterations 函数每次都返回相同的数字?

确实,转念一想,编译器是否需要向前看?风格指南建议方法方法比使用常量值更好,我猜这是对的吗,因为“常量”值在任何范围内使用后都不需要保存在内存中它在已经完成了吗?

总而言之,我的问题是:是否不鼓励使用常量值,如果是,为什么?

(对于奖励积分,将常量值声明为方法和声明为常量之间的技术差异是什么?)

最佳答案

大多数编译器都是内联的。

话虽如此,风格指南是有道理的。它说而不是这样做:

#define FOO_MAX_ITERATIONS 25
struct Foo {
void do_it() { for(int i = 0; i < FOO_MAX_ITERATIONS; i++) iterate(); }
};

应该是这样的:

struct Foo {
int getMaxIterations() { return 25; }
void do_it() { for(int i = 0; i < getMaxIterations(); i++) iterate(); }
};

如您所见,从长远来看,它的一致性和可读性要好得多,并且有利于以后的设计,例如当您从类继承时。稍后,您可能希望在运行时修改 getMaxIterations(),这样您就不必像 #define FOO_MAX_ITERATIONS someMethod() 这样丑陋的 hack。

如果您使用的是任何健全的 C++11 编译器(即不是 Visual Studio),则此类函数应另外声明为:

struct Foo {
constexpr int getMaxIterations() { return 25; }
void do_it() { for(int i = 0; i < getMaxIterations(); i++) iterate(); }
};

注意 getMaxIterations() 声明中的 constexpr。这告诉 C++11 编译器它是一个“常量表达式”,并且可以在编译时对其求值。通过这样做,它可以在编译之前直接将 getMaxIteratsion() 替换为 25,还有很多很多其他事情,例如允许您在其他编译时声明中使用它。

关于c++ - 不鼓励在 C++ 中使用常量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609971/

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