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