gpt4 book ai didi

clang 中的 C++ 结构内存开销?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:00 24 4
gpt4 key购买 nike

clang 中是否存在每个结构的内存开销?通常结构的大小只是其所有成员的总大小。但是在 clang 中似乎不是这样:

#include <iostream>
using namespace std;

struct Obj {
int x;
int y;
};

int main() {
int a = 42;
int b = 43;
Obj obj = {100, 101};
int c = 44;

cout << *(&a - 0) << endl; // 42
cout << *(&a - 1) << endl; // 43
cout << *(&a - 2) << endl; // On clang this prints garbage value instead of 101, how strange...
cout << *(&a - 3) << endl; // 101
cout << *(&a - 4) << endl; // 100
cout << *(&a - 5) << endl; // 44

return 0;
}

我用clang++ program.cpp编译,没有优化。版本:

Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix

(&a - 2) 的内存位置似乎根本没有被使用。我在 int aint b 的声明之间插入了以下代码:

*(&a - 2) = -1234;

稍后将打印 -1234 而不是 *(&a - 2) 上的垃圾值,表明 clang 在创建 后没有写入该值>Obj obj,这让我想知道为什么 clang 首先保留它。

在 gcc 上这表现不同。首先,在我机器上的 gcc 上,堆栈似乎向更高的内存地址增长。此外,gcc 自行将变量 c 放在 b 之后,因此它看起来像这样:

cout << *(&a + 0) << endl;  // 42
cout << *(&a + 1) << endl; // 43
cout << *(&a + 2) << endl; // 44 gcc moved c here even without optimization
cout << *(&a + 3) << endl; // 100
cout << *(&a + 4) << endl; // 101

g++ program.cpp 编译。版本:

 g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

当我将程序移植到 C 时的行为相同。一切都在 64 位 Linux Mint 17.1 上运行。有人可以解释一下 clang 浪费 4 字节内存是否有更大的目的吗?

最佳答案

您运行的测试与结构无关,而与堆栈有关。从随机堆栈内存位置开始读取是未定义的行为,编译器有权对它们做任何想做的事。如果没有优化,很明显编译器不会费心去高效地使用它们。没有人关心在没有优化的情况下丢失几个字节。

此外,结构和类布局由 GCC 和 Clang 通用的标准定义,因此我向您保证它们在 Linux 上是相同的(模数错误)。

从本质上讲,您假设编译器在堆栈上以精确的顺​​序布置您的局部变量,没有其他任何东西,但绝对没有理由相信这是真的。编译器没有义务以任何方式布置堆栈。

关于clang 中的 C++ 结构内存开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27467238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com