4

我有

const int MAX_CONNECTIONS = 500;
//...
if(clients.size() < MAX_CONNECTIONS) {
    //...
}

我正在尝试为 MAX_CONNECTIONS 找到“正确”的选择。所以我启动了 gdb 和set MAX_CONNECTIONS = 750. 但似乎我的代码没有响应这个变化。我想知道这是否是因为 const int 在编译时已解决,即使它最终在运行时遇到问题。这听起来对吗,并且,使用 GDB 有什么方法可以绕过这种效果,而无需在我的程序中编辑代码?加热到 500 需要一段时间。

4

2 回答 2

3

我怀疑编译器看到变量是const,将常量内联到程序集中,并且没有让生成的代码实际读取MAX_CONNECTIONS变量的值。C++ 规范的措辞是,如果显式标记了原始类型的变量const,编译器可以出于优化目的对其做出某些假设,因为任何更改该常量的尝试都是(1)非法或(2)导致未定义的行为。

如果你想使用 GDB 来做这样的事情,考虑标记变量volatile而不是const向编译器指示它不应该优化它。或者,让这些信息由其他数据源(例如,文件中的配置选项)控制,这样您就不会为了更改值而从其下方爆破程序的内存。

希望这可以帮助!

于 2012-06-11T20:04:34.440 回答
2

通过告诉它它是const,你是在告诉编译器它可以自由地不加载该值,而是在可能的情况下将其直接构建到代码中。当所选的特定指令需要加载值而不是立即值时,分配的副本仍然存在,或者也可以由编译器省略。对于标准语言来说,这有点松散的答案,但这是基本思想。

于 2012-06-11T20:06:51.113 回答