这是一个图像 2024-02-04 11:03 采纳率: 25%
浏览 2

vs工程开启最大速度优化变量地址改变的原理?

vs2013中,release开启最大速度优化,成员变量的地址一直跳来跳去,是一个什么原理。关闭最大优化速度后,地址固定。
虽然地址在跳,但是变量赋值使用,或者传输到其他类的函数(形参为指针变量),值还是正确的。

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-04 11:07
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    在Visual Studio 2013中,当你开启最大优化级别(通常是在Release模式下设置为/O2/Ox编译器选项),编译器会对代码进行深度优化以提高执行速度。这种优化可能会导致变量的存储布局和内存地址行为发生变化,原因如下:

    1. 寄存器分配:编译器可能将频繁使用的变量放入CPU寄存器而不是内存中,这样可以减少访问内存的时间开销。由于寄存器数量有限且比内存访问速度快得多,所以变量可能不再有固定的内存地址。

    2. 重新排序和消除

      • 指令重排:编译器会按照对性能最有利的顺序重新排列指令,这可能导致变量赋值和读取的顺序与源代码中的顺序不同。
      • 死存储区消除:如果编译器判断出某个局部变量在整个生命周期内未被实际使用,它可能会选择完全不为其分配存储空间。
      • 布局优化:即使变量确实存储在内存中,编译器也可能会为了改善数据局部性或者减少内存访问冲突而重新安排变量在内存中的相对位置。
    3. 内联函数和链接时间代码生成:在最大化优化级别时,编译器更倾向于内联小函数以减少函数调用开销,并且在某些情况下,通过链接时代码生成(Link Time Code Generation, LTCG)进一步优化全局范围内的代码布局。

    4. 其他高级优化:例如常量折叠、循环展开、函数内联等也可能间接影响变量的存储位置和可见性。

    尽管这些优化可能导致变量地址跳变,但编译器保证程序的语义正确性——即无论地址如何变化,只要在源代码中遵循正确的指针和引用规则,变量的值在逻辑上始终是正确的。这是因为编译器必须遵守语言规范,在保持程序正确性的前提下进行优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月4日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示