zoukankan      html  css  js  c++  java
  • const与volatile [转]

    昨天笔试遇到了关于c++中关于const与const_cast的题目,大概如下:

    int main(int argc, char* argv[])
    {
         const int a = 10;
         int * p = const_cast<int *>(&a);
         *p = 1;
         printf("%d %d\n", a, *p);
         return 0;
    }

    求上述程序的输出结果,正确答案是:10 1

    分析如下:

    首先可以确定是p和&a的地址是指向同一片内存区域的,理论上来说最后的输出结果应该是1 1
    但是为什么会输出a的值为10呢? 猜测应该是const关键字的问题,可能编译器看到a为const型变量,所以在编译期就将所有的a直接替换为10了,这个是编译器做的一个优化,
    下面简单的验证下:
    直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:

            movl    %edi, -20(%rbp)
            movq    %rsi, -32(%rbp)
            movl    $10, -12(%rbp)
            leaq    -12(%rbp), %rax
            movq    %rax, -8(%rbp)
            movq    -8(%rbp), %rax
            movl    $1, (%rax)
            movq    -8(%rbp), %rax
            movl    (%rax), %edx
            movl    $10, %esi
            movl    $.LC0, %edi
            movl    $0, %eax
            call    printf
            movl    $0, %eax
            leave
            ret

    显然%rax中存放的指针p的值,(%rax)代表间接寻址
    在调用printf函数之前,将10放入%esi, (%rax)放入到%edx中,显然验证了上述的猜想

    关于volatile关键字

    如何避免编译器做这方面的优化呢?
    一个常用的方法是将变量a加上关键字volatile,代表是”易变,每次都需要从内存中读取,这样上述程序的运行结果就是1 1了
    当然修改常量变量的值不是好的编程习惯,尽量还是少用上述用法

     

    http://yaronspace.cn/blog/archives/category/%E9%9D%A2%E8%AF%95%E9%A2%98

  • 相关阅读:
    MySQL 82 张图带你飞
    Docker一个优秀的应用容器
    大数据架构基础知识
    浏览器复杂吗
    5 分钟学懂 SSH 隧道技术
    图解数据分析如何驱动决策
    3D可视化管理推进能源革命
    一文全面解读B端产品和C端产品的差异
    智慧农业解决方案
    Win10删除右键多余选项菜单
  • 原文地址:https://www.cnblogs.com/viviancc/p/2678638.html
Copyright © 2011-2022 走看看