我有
const int MAX_CONNECTIONS = 500;
//...
if(clients.size() < MAX_CONNECTIONS) {
//...
}
我正试图找到MAX_CONNECTIONS的“正确”选择。所以我启动了gdb和set MAX_CONNECTIONS = 750
。但似乎我的代码没有响应这一变化。我想知道是不是因为const int在编译时被解析了,即使它在运行时遇到了问题。这听起来是否正确,并且,使用GDB有什么方法可以绕过这种效果,而无需编辑程序中的代码?只需要一段时间就可以预热到500。
答案 0 :(得分:2)
我怀疑编译器看到变量是const
,正在将常量内联到程序集中,并且生成的代码实际上没有读取MAX_CONNECTIONS
变量的值。 C ++规范的措辞方式是,如果原始类型的变量被明确标记为const
,编译器可以出于优化的目的对其进行某些假设,因为任何改变该常量的尝试都是(1)非法或(2)导致未定义的行为。
如果您想使用GDB执行此类操作,请考虑标记变量volatile
而不是const
以向编译器指示它不应对其进行优化。或者,让这些信息由其他数据源控制(例如,文件中的配置选项),这样您就不会从其下面将程序的内存爆破,以便更改值。
希望这有帮助!
答案 1 :(得分:2)
通过告诉它const
,你告诉编译器它有自由不加载值,但是在可能的情况下直接将它构建到代码中。当所选择的特定指令需要加载值而不是具有立即值时,分配的副本可能仍然存在,或者编译器也可以省略它。对于标准而言,这是一个松散的答案,但这是基本的想法。