c++ gdb -重新设置常量

jdgnovmf  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(172)

我已经

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

我试图为MAX_CONNECTIONS找到“正确”的选择。所以我启动了gdb和set MAX_CONNECTIONS = 750。但是我的代码似乎没有对这个更改做出响应。我想知道这是否是因为const int在编译时被解析,尽管它在运行时最终被撞到了。这听起来对吗,还有,使用GDB,有没有什么方法可以绕过这个效果,而不必编辑我的程序代码?2它需要一段时间才能预热到500。

omvjsjqw

omvjsjqw1#

我怀疑编译器在看到变量是const时,会将常量内联到程序集中,而不是让生成的代码实际读取MAX_CONNECTIONS变量的值。C++规范的措辞是这样的:如果一个基元类型的变量显式标记为const,则编译器可以出于优化的目的对其进行某些假设,因为任何改变该常数尝试要么(1)非法要么(2)导致未定义的行为。
如果你想用GDB来做这样的事情,考虑标记变量volatile而不是const,以指示编译器不应该优化它。或者,让这个信息由其他数据源控制(比如,文件中的一个配置选项),这样你就不会为了改变这个值而从它下面破坏程序的内存。
希望这对你有帮助!

hgb9j2n6

hgb9j2n62#

通过告诉它它是const,你就告诉编译器它可以不加载值,而是在可能的情况下直接将它构建到代码中。当所选的特定指令需要加载一个值而不是立即值时,分配的副本可能仍然存在,或者它也可以被编译器忽略。这是一个有点松散的标准答案。但这是基本的想法。

bn31dyow

bn31dyow3#

由于这篇文章已经很老了,我的回答更像是对我未来的自我的一个参考。假设你在调试模式下编译,在调试器中运行下面的表达式(在我的例子中是lldb)是有效的:

const_cast<int&>(MAX_CONNECTIONS) = 750

如果必须经常更改常量(例如在循环中),请设置断点,并在每次命中断点时计算表达式

breakpoint set <location>
breakpoint command add <breakpoint_id>
const_cast<int&>(MAX_CONNECTIONS) = 750
DONE

相关问题