为什么一个接一个声明的两个变量在内存中不相邻?
Why two variables declared one after another are not next to each other in memory?
我正在使用代码示例来检查两个整数之间的距离,就像这个问题的答案一样。
int i = 0, j = 0;
std::cout << &i - &j;
根据我对内存表示的理解,这两个变量的这些内存地址应该彼此相邻,并且相差应该正好是1。
令我惊讶的是,在VS2017中使用MS编译器运行此代码可打印3,并使用GCC运行相同的代码可打印1。
为什么会这样,VS有问题吗?
C++标准没有要求C++编译器以任何特定方式分配具有自动存储持续时间的变量,包括使它们在内存中连续。事实上,编译器可以选择不为变量分配任何内存,从而完全优化它。
这就是为什么减去指针只有在它们都指向同一数组中的内存或一个元素超过其末尾时才有意义。在所有其他情况下,包括你的情况,你都会得到未定义的行为。
您尝试的指针算术具有未定义的行为:
如果指针 P 指向数组的第 i 个元素,并且 指针 Q 指向同一数组的第 j 个元素,即 表达式 P-Q 的值为 i-j,如果该值符合 std::p trdiff_t。两个操作数必须指向同一数组的元素(或一个 超过结束(,否则行为是未定义的。如果结果确实如此 不适合 std::p trdiff_t,行为未定义。
相关文章:
- 重新定位图像时如何前进到下一个内存块
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- C++,一个内存块与多个内存块
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 从一个内存的一个块创建许多eigen :: vectorxd
- 如何使用任意数量的(编译时间确定的)容器创建一个内存池
- 未知错误,调试器只给我一个内存地址
- 你能给我一个内存泄漏的真实工作示例吗?
- 如何知道两个C字符串是否指向一个内存块
- 设计一个内存覆盖检测工具
- Getline返回一个内存地址
- 如何获得一个内存区域的保护标志,标志是PROT_READ /PROT_EXEC在mprotect
- c++又是一个内存泄漏问题
- 为什么我在这里得到一个内存相关的错误
- 我可以为多个向量使用一个内存池吗
- 一个内存高效的SHA1实现