探讨register关键字在c语言和c++中的差异

 更新时间:2013年10月11日 08:49:40   作者:  
建议不要用register关键字定义全局变量,因为全局变量的生命周期是从执行程序开始,一直到程序结束才会终止,而register变量可能会存放在cpu的寄存器中,如果在程序的整个生命周期内都占用着寄存器的话,这是个相当不好的举措

在c++中:

(1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类。

(2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中。

在c中:

(1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告“有坏的存储类”。

(2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符。否则编译不通过。

建议不要用register关键字定义全局变量,因为全局变量的生命周期是从执行程序开始,一直到程序结束才会终止,而register变量可能会存放在cpu的寄存器中,如果在程序的整个生命周期内都占用着寄存器的话,这是个相当不好的举措。

以下是从网上摘自别人的:

C和C++处理register关键字的一处差异

C++并不是完全兼容C语言的,上次提到的sizeof('a')等于几的问题就是一例。今天我在编码时又无意中发现了一处不同:

用register关键字修饰的变量,在c语言中是不可以用&操作符取地址的,这是我已有的经验。因为编译器如果接受了程序员的建议把变量存入寄存器,它是不存在虚拟地址的。但在C++中,用register修饰的变量可以用&操作符取地址,这是我在一段代码中发现的。如果程序中显式取了register变量的地址,编译器一定会将这个变量定义在内存中,而不会定义为寄存器变量。

我在C99(ISO/IEC 9899:1999)和ISO C++(ISO/IEC 14882:2003)标准中得到了确认,C和C++标准对register遇到&的处理确实有不同的明确定义。但为什么要这样定义?我只能从标准的字里行间猜测。K&R C1中如何描述register我尚未查证,K&R C2(ANSI C)中说明了“register variables are to be placed in machine registers ... but compilers are free to ignore the advice ”。但在C99和ISO C++中,措辞分别变成:“suggests that access to the object be as fast as possible”、“a hint to the implementation that the object so declared will be heavily used”,不再特别提及“machine registers”。可见历史上register关键字在强调尽可能地把变量保存到寄存器,而现在的register关键字不再强调具体手段,只是建议编译器通过各种可行的方式优化该变量的访问(不过很多编译器会忽略这一关键字,而采用自身的优化策略)。C99可能是为了保持对K&R C的兼容而不允许取地址操作;而C++也许是因为没有历史包袱才放宽了这个限制吧。猜测而已,希望知道内幕的朋友告诉我更精确的答案。

您可能感兴趣的文章:

相关文章

  • 总结C语言中const关键字的使用

    总结C语言中const关键字的使用

    一起虽然学过c语言,但是并没有写过太多的代码,最近想要拾起c语言,就写了一些代码,但是对const关键字比较陌生,这里总结一下,方法自己和大家有需要的时候参考借鉴,下面跟着小编一起学习学习吧。
    2016-11-11
  • QT修改项目名称的图文示例

    QT修改项目名称的图文示例

    本文主要介绍了QT修改项目名称的图文示例,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 在C++中自定义宏的简单方法

    在C++中自定义宏的简单方法

    这篇文章主要介绍了在C++中自定义宏的简单方法,作者建议使用类似定义函数一样的方法来定义宏,需要的朋友可以参考下
    2015-07-07
  • Matlab实现黑洞优化算法的示例代码

    Matlab实现黑洞优化算法的示例代码

    根据黑洞现象原理首次提出BH 算法,它在传统PSO基础上引入了新的机制,有效地提高了收敛速度并防止了陷入局部极值的情况发生.本文将用Matlab实现这一算法,需要的可以参考一下
    2022-06-06
  • C/C++ Qt 基本文件读写的基本使用(2种实现)

    C/C++ Qt 基本文件读写的基本使用(2种实现)

    文件的读写是很多应用程序具有的功能,本文主要介绍了两种实现方法,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写
    2021-11-11
  • 关于数据结构单向链表的各种操作

    关于数据结构单向链表的各种操作

    这篇文章主要介绍了关于数据结构单向链表的各种操作,关于数据结构链表的操作一般涉及的就是增删改查,下面将关于无空头链表展开介绍,需要的朋友可以参考下
    2023-04-04
  • C++与Lua交互原理实例详解

    C++与Lua交互原理实例详解

    这篇文章主要介绍了C++与Lua交互原理实例详解,有感兴趣的同学可以研究下
    2021-02-02
  • C++实现简单计算器功能

    C++实现简单计算器功能

    这篇文章主要为大家详细介绍了C++实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • strcat函数实现简单示例

    strcat函数实现简单示例

    这篇文章主要介绍了strcat函数实现简单示例,需要的朋友可以参考下
    2014-03-03
  • C语言内存对齐实例详解

    C语言内存对齐实例详解

    这篇文章主要介绍了C语言内存对齐,包括内存对其的基本概念及用法,以及注意事项,并以实例形式加以说明,需要的朋友可以参考下
    2014-09-09

最新评论