C语言函数临时变量内存布局
2025-04-11
2
0
使用的是VS2019编译
对于下面同一段代码:
#include <iostream>
#include <vector>
#include <algorithm>
struct AA
{
const char* name;
void* pt;
AA(const char* n, void* p)
{
name = n;
pt = p;
}
};
std::vector<AA> vec;
size_t i;
void test() {
int a;
double b;
char c;
int d;
int e;
vec.push_back(AA("a", &a));
vec.push_back(AA("b", &b));
vec.push_back(AA("c", &c));
vec.push_back(AA("d", &d));
vec.push_back(AA("e", &e));
std::sort(vec.begin(), vec.end(),
[](AA& a, AA& b){
return a.pt > b.pt;
});
for (i = 0; i < vec.size(); i++)
{
std::cout << vec[i].name << " ";
}
std::cout << std::endl;
std::cout << "&a: " << &a << std::endl;
std::cout << "&b: " << &b << std::endl;
std::cout << "&c: " << (void*)&c << std::endl;
std::cout << "&d: " << &d << std::endl;
std::cout << "&e: " << &e << std::endl;
}
int main() {
test();
return 0;
}
分别对于不同的编译,其内存地址如下:
x86-debug
a b c d e
&a: 003CFB40
&b: 003CFB30
&c: 003CFB27
&d: 003CFB18
&e: 003CFB0C
x64-debug
e d c b a
&a: 0000007C3BDDF504
&b: 0000007C3BDDF528
&c: 0000007C3BDDF544
&d: 0000007C3BDDF564
&e: 0000007C3BDDF584
x86-release
b d a e c
&a: 00EFF928
&b: 00EFF930
&c: 00EFF923
&d: 00EFF92C
&e: 00EFF924
x64-release
b e d a c
&a: 000000CFBD4FF814
&b: 000000CFBD4FF820
&c: 000000CFBD4FF810
&d: 000000CFBD4FF818
&e: 000000CFBD4FF81C
可以看到,对于DEBUG情况下,内存布局是线性的。只是X86是递减的,X64是递增的
但是对于Release情况下,由于由于内对齐的原因,编译器会进行优化,而会现调整。
- 优化将占用内存大的放在高端地址,如果内存大小相同,x86会有随机,x64则是先放后声名的。