11.register变量

11.变量的存储类型-register变量


11.1 知识点

寄存器和内存

寄存器和内存是计算机中两种不同类型的数据存储方式。

存储位置不同

  • 寄存器:寄存器是CPU内部的一部分,用于存储正在被处理的数据和指令,是 CPU 中最快的存储单元,位于处理器的核心部分。
  • 内存:是指计算机系统中用于存储数据和程序指令的区域。内存的存储位置位于 CPU 外部,但与 CPU 通过总线连接。内存一般指内存条、硬盘中的虚拟内存中的存储空间。

存取速度不同

  • 寄存器:非常快!存取速度非常快。
  • 内存:相对寄存器较慢,比硬盘快。

存储容量

  • 寄存器:数量和容量非常有限,主要用于存储临时数据、操作数、计算结果等非常短期的数据。
  • 内存:容量大得多,取决于你的内存条容量,可以存储大量的数据,适用于存储代码、变量等等数据。

对于我们来说的意义

在大多数编程环境中,我们无法直接操作寄存器上的内容。相对于程序来说,寄存器是一个由硬件自动管理的存储区域!在大多数编程环境中,我们提到的内存通常是指存储在内存条中的数据,而不是指 CPU 内部的寄存器。

register变量

注意:

该知识主要做了解,在现代C++开发中使用较少,因为现代编译器中会自动优化变量的存储位置,往往比我们手动使用 register 关键词更加有效,在较新版本的C++中已经被废弃了。

寄存器变量

  • 用法
register 变量类型 变量名;
  • 作用register 修饰的变量会变为寄存器变量,会将变量存储在 CPU 的寄存器中,而不是存储在内存中。这样可以有效提高访问速度,当使用变量时将直接从寄存器中读写。

  • 生命周期:与普通局部变量一样,生命周期是其所在的作用域。

优点与缺点

  • 优点:在某些情况下,register 可以显著提高变量的访问速度,适合循环中的计数器等高频访问的变量。
  • 缺点:现代编译器通常已经非常优化,对寄存器的分配也比较智能,显式使用 register 可能不会带来明显的性能提升;不能获取 register 变量的地址,因为寄存器没有地址(寄存器变量无法使用取地址符号 &)。
register auto i = 10; // 这样声明不会存在我们内存中了,而是在寄存器中
cout << i << endl; // 访问它会快一些

for (register int i = 0; i < 10; i++) {
    // 循环体
}

耗时测试

测试普通变量在循环中的耗时情况

auto start1 = std::chrono::high_resolution_clock::now();
int num_iterations1 = 100000000;  // 循环次数,可根据实际情况调整
for (int i = 0; i < num_iterations1; ++i) {
    int temp = i;
    temp += 1;
}
auto end1 = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed1 = end1 - start1;
std::cout << "普通变量循环耗时: " << elapsed1.count() << " 秒" << std::endl;

测试使用 register 变量在循环中的耗时情况

auto start2 = std::chrono::high_resolution_clock::now();
int num_iterations2 = 100000000;  // 循环次数,可根据实际情况调整
for (register int i = 0; i < num_iterations2; ++i) {
    register int temp = i;
    temp += 1;
}
auto end2 = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed2 = end2 - start2;
std::cout << "使用register变量循环耗时: " << elapsed2.count() << " 秒" << std::endl;

11.2 知识点代码

Lesson11_变量的存储类型_register变量.cpp

#include <iostream>
#include <chrono>
using namespace std;
int main()
{
    std::cout << "变量的存储类型_register变量\n";

    #pragma region 知识点一 寄存器和内存

    //寄存器和内存是计算机中两种不同类型的数据存储方式

    //存储位置不同:
    //寄存器:寄存器是CPU内部的一部分,用于存储正在被处理的数据和指令
    //       是 CPU 中最快的存储单元,位于处理器的核心部分

    //内存:是指计算机系统中用于存储数据和程序指令的区域
    //     内存的存储位置位于 CPU 外部,但与 CPU 通过总线连接
    //     内存一般指内存条、硬盘中的虚拟内存中的存储空间

    //存取速度不同:
    //寄存器:快快快!存和取都非常块
 
    //内存:相对寄存器较慢,比硬盘块

    //存储容量:
    //寄存器:数量和容量非常有限,主要用于存储临时数据、操作数、计算结果等非常短期的数据

    //内存:容量大得多,取决于你的内存条容量,可以存储大量的数据,适用于存储代码、变量等等数据

    //对于我们来说的意义
    //在大多数编程环境中,我们无法直接操作寄存器上的内容。
    //相对于程序来说,寄存器是一个由硬件自动管理的存储区域!
    //在大多数编程环境中,我们提到的内存通常是指存储在内存条中的数据
    //而不是指 CPU 内部的寄存器

    #pragma endregion

    #pragma region 知识点二 register变量

    //注意:
    // 该知识主要做了解,在现代C++开发中使用较少,因为现代编译器中会自动优化变量的存储位置
    // 往往比我们手动使用 register 关键词更加有效,在较新版本的C++中已经被废弃了

    //寄存器变量
    //用法:
    // register 变量类型 变量名;
    //作用:
    // register修饰的变量会变为寄存器变量
    // 会将变量存储在CPU的寄存器中,而不是存储在内存中
    // 这样可以有效的提高访问速度,当使用变量时将直接从寄存器中读写
    //生命周期:
    // 与普通局部变量一样,生命周期是其所在的作用域

    //优点:
    // 在某些情况下,register 可以显著提高变量的访问速度,适合循环中的计数器等高频访问的变量
    //缺点:
    // 现代编译器通常已经非常优化,对寄存器的分配也比较智能,
    // 显式使用 register 可能不会带来明显的性能提升
    // 不能获取 register 变量的地址,因为寄存器没有地址(寄存器变量无法使用取地址符号 &)


    register auto i = 10;//这样声明不会存在我们内存中了 而是在寄存器中
    cout << i << endl;//访问他会快一些

    for (register int i = 0; i < 10; i++)
    {

    }

    #pragma endregion

    #pragma region 知识点三 耗时测试

    // 测试普通变量在循环中的耗时情况
    auto start1 = std::chrono::high_resolution_clock::now();
    int num_iterations1 = 100000000;  // 循环次数,可根据实际情况调整
    for (int i = 0; i < num_iterations1; ++i) {
        int temp = i;
        temp += 1;
    }
    auto end1 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed1 = end1 - start1;
    std::cout << "普通变量循环耗时: " << elapsed1.count() << " 秒" << std::endl;

    // 测试使用register变量在循环中的耗时情况
    auto start2 = std::chrono::high_resolution_clock::now();
    int num_iterations2 = 100000000;  // 循环次数,可根据实际情况调整
    for (register int i = 0; i < num_iterations2; ++i) {
        register int temp = i;
        temp += 1;
    }
    auto end2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed2 = end2 - start2;
    std::cout << "使用register变量循环耗时: " << elapsed2.count() << " 秒" << std::endl;

    #pragma endregion
}

11.3 练习题

寄存器和内存的区别是什么?

寄存器和内存是计算机中两种不同类型的数据存储方式

存储位置不同:

  • 寄存器:寄存器是CPU内部的一部分,用于存储正在被处理的数据和指令。是 CPU 中最快的存储单元,位于处理器的核心部分。
  • 内存:是指计算机系统中用于存储数据和程序指令的区域。内存的存储位置位于 CPU 外部,但与 CPU 通过总线连接。内存一般指内存条、硬盘中的虚拟内存中的存储空间。

存取速度不同:

  • 寄存器:快快快!存和取都非常快。
  • 内存:相对寄存器较慢,比硬盘快。

存储容量:

  • 寄存器:数量和容量非常有限,主要用于存储临时数据、操作数、计算结果等非常短期的数据。
  • 内存:容量大得多,取决于你的内存条容量,可以存储大量的数据,适用于存储代码、变量等等数据。

寄存器变量的关键字是什么?作用是什么?为什么不建议使用?

  • register
  • 声明一个直接存储在寄存器中的变量,让变量的读写更快速。
  • 显式使用 register 可能不会带来明显的性能提升,新版本C++已经废弃 register 关键字了。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏