我已经
const int MAX_CONNECTIONS = 500;
//...
if(clients.size() < MAX_CONNECTIONS) {
//...
}
我试图为MAX_CONNECTIONS找到“正确”的选择。所以我启动了gdb和set MAX_CONNECTIONS = 750
。但是我的代码似乎没有对这个更改做出响应。我想知道这是否是因为const int在编译时被解析,尽管它在运行时最终被撞到了。这听起来对吗,还有,使用GDB,有没有什么方法可以绕过这个效果,而不必编辑我的程序代码?2它需要一段时间才能预热到500。
3条答案
按热度按时间omvjsjqw1#
我怀疑编译器在看到变量是
const
时,会将常量内联到程序集中,而不是让生成的代码实际读取MAX_CONNECTIONS
变量的值。C++规范的措辞是这样的:如果一个基元类型的变量显式标记为const
,则编译器可以出于优化的目的对其进行某些假设,因为任何改变该常数尝试要么(1)非法要么(2)导致未定义的行为。如果你想用GDB来做这样的事情,考虑标记变量
volatile
而不是const
,以指示编译器不应该优化它。或者,让这个信息由其他数据源控制(比如,文件中的一个配置选项),这样你就不会为了改变这个值而从它下面破坏程序的内存。希望这对你有帮助!
hgb9j2n62#
通过告诉它它是
const
,你就告诉编译器它可以不加载值,而是在可能的情况下直接将它构建到代码中。当所选的特定指令需要加载一个值而不是立即值时,分配的副本可能仍然存在,或者它也可以被编译器忽略。这是一个有点松散的标准答案。但这是基本的想法。bn31dyow3#
由于这篇文章已经很老了,我的回答更像是对我未来的自我的一个参考。假设你在调试模式下编译,在调试器中运行下面的表达式(在我的例子中是lldb)是有效的:
如果必须经常更改常量(例如在循环中),请设置断点,并在每次命中断点时计算表达式