zoukankan      html  css  js  c++  java
  • [转]关于const与volatile笔试题目的分析…vilatile 是去除优化

     

    关于const与volatile笔试题目的分析

    小计录:今天转么对 以下代码上机实验:

    const_cast前后的内存地址是一样,只不过 &a是常指针,而转换后的是一般指针。,

    关键点是: 编译器看到const ,在编译时就把所有引用const 变量的地方替换了。

    所以第一次使用const的地方才分配内存!!(只分配一次内存的还有引用)

    2012年3月8日12:49:53 by 66

     

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

    点击隐藏CPP CODE

    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了,这个是编译器做的一个优化,

     

    下面简单的验证下:

    直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:

    点击隐藏ASM CODE

            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
    事务、存储、索引与慢查询及数据库设计的三大范式
    Navcat 软件使用及 pymysql模块
    MySQL单表查询与多表查询
    IO 模型
    Unable to round-trip http request to upstream: read tcp 192.168.xx.xxx:xxxxx->xx.xxx.xxx.x:xxx: read: operation timed out
    恶补计算机基础知识(一)
    2020 年终总结
    自我总结Java并发编程基础篇(一)
    jvm系列(三):GC算法、垃圾收集器
  • 原文地址:https://www.cnblogs.com/titer1/p/2385050.html
Copyright © 2011-2022 走看看