gpt4 book ai didi

c++ - 有人请解释一下这样的行为吗?

转载 作者:行者123 更新时间:2023-12-01 14:05:58 24 4
gpt4 key购买 nike

int main(){
int p = 10 , q = 11;
int a[3];
int * ptr = &q;
cout << *ptr+1 <<endl;

cout <<"P = " << (int)&p <<endl;
cout <<"q = " << (int)&q <<endl;
cout << "Size of p = "<< sizeof(p) <<endl;
cout << "(int)&a[0]:" << (int)&a[0] <<endl;
cout << "(int)&a[1]:" << (int)&a[1] <<endl;
cout << "(int)&a[2]:" << (int)&a[2] <<endl;
}

这段代码的输出是
12
P = 14679472
q = 14679460
Size of p = 4
(int)&a[0]:14679440
(int)&a[1]:14679444
(int)&a[2]:14679448

现在我有几个问题。
-int占用4个字节或8个字节,但是p和q之间的差是12。我不明白吗?这是什么?我在这里错过了重要的事情吗?
-我实际上是在阅读有关堆叠框架的信息,因此任何人都可以解释或提供良好的学习 Material ,这将是非常值得的。

最佳答案

关于(释义):

An int take four or eight bytes but here the difference between p and q is twelve.


int不需要四个或八个字节,这在许多实现中只是常见的事情。该标准指定了最小范围,但没有最大范围。在任何情况下,该标准都不要求以不同的顺序在堆栈上分配不同的变量。实际上,它根本不要求堆栈,而只是必须以某种方式运行。

授予的数组必须以某种特定的方式排序(从 a元素的地址中可以看到),但是 pq不属于数组。并且,甚至认为 a元素地址相隔四个字节,即使这不是强制性的。一个实现可以在元素之间以及最后一个元素之后添加填充。

由于您不能(安全地)使用 p的地址来执行除访问 p本身以外的任何操作,因此它的地址实际上是无关紧要的。

关于您关于优质引用资料的第二个问题,实际上是Stack Overflow不赞成的,最接近的原因之一是:

Seeking recommendations for books, tools, software libraries, and more. This question is likely to lead to opinion-based answers.



因此,我不会再回答这个问题。

但是,我将提供一些额外的建议:如果您真的想知道代码的具体实现方式,则应直接转到 GodBolt并键入代码。进行一些小的修改以使其可以干净地编译:
#include <iostream>
#define USE_P 1
#define USE_Q 1
#define USE_A 1
int main() {
#if USE_P
int p = 10;
#endif
#if USE_Q
int q = 11;
#endif
#if USE_A
int a[3] = {12, 13, 14};
#endif
std::cout << "hello\n";
}

您会在 main的开头看到类似于以下内容(尽管我添加了注释):
push    rbp
mov rbp, rsp
sub rsp, 32 // Stack frame size
mov DWORD PTR [rbp-4], 10 // p
mov DWORD PTR [rbp-8], 11 // q
mov DWORD PTR [rbp-20], 12 // a[0]
mov DWORD PTR [rbp-16], 13 // a[1]
mov DWORD PTR [rbp-12], 14 // a[2]

当您告诉它停止以任何组合使用这些变量中的任何一个时,您会看到这种变化。从我给出的示例(并使用 x86-64 gcc 10.1)中,似乎已按预期放置了变量。但是,如前所述,这不是必需的。

关于c++ - 有人请解释一下这样的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61999314/

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