Pointers c中指向结构的指针的大小

Pointers c中指向结构的指针的大小,pointers,data-structures,Pointers,Data Structures,这是结构声明 struct node { int data; struct node *next; }; 当我执行下面一行时,ptr2的大小不应该是12字节吗(我使用64位机器) 输出如下: kv@kv:~/Desktop$ ./a.out 8 16 这取决于编译器中的对齐设置。为了对齐关键的结构> (例如,对于文件格式的解码/编码目的)尝试这个(用C++语言,如果你有不同的文档,看看如何实现类似的功能): #pragma包(1) 结构节点 { int数据; 结构节点*下一步; };

这是结构声明

struct node
{
  int data;
  struct node *next;
};
当我执行下面一行时,
ptr2
的大小不应该是12字节吗(我使用64位机器)

输出如下:

kv@kv:~/Desktop$ ./a.out
8
16

这取决于编译器中的对齐设置。为了对齐关键的<代码>结构> <代码>(例如,对于文件格式的解码/编码目的)尝试这个(用C++语言,如果你有不同的文档,看看如何实现类似的功能):

#pragma包(1)
结构节点
{
int数据;
结构节点*下一步;
};
#pragma pack()
在您的情况下,看起来您已将align设置为8或16字节。此属性用于对齐数据,通过更好地寻址数学和减少缓存未命中来加快内存访问

  • #pragma pack(x)
    临时将align属性设置为
    x
    字节
  • #pragma pack()
    恢复以前的对齐设置
你可以把它们看作是一个“推”和“弹出”

align告诉编译器应该对齐任何
struct/class/union
的大小,因此它们总是以align属性地址的倍数开始/结束。这对于指针逻辑很重要。例如,如果您的align为8或16,并且您的结构是原始大小12字节,则编译器将用空白填充其余部分,以匹配align大小的倍数(在您的情况下,添加4个字节)。这将导致较少的缓存未命中(如果align对于当前的CPU来说足够大)。一些编译器还可以利用这一点(如果大小为2的幂),将指针数学更改为位移位

尝试在IDE中搜索以下内容:
Project->Options->Compiler->Align


但正如你们中很少有人指出的,在某些体系结构中,不对齐的内存访问是被禁止的(如SPARC),并且通常会导致崩溃/异常。

这是有效的(ptr2有12个字节)。你能详细说明一下pragma pack()的具体功能吗?不,不应该。指针在x86-64上是8字节对齐的。@AnttiHaapala ptr2不是指针@Spektre next是指针。当然,
int
也是LP64和LLP64上的32位。
kv@kv:~/Desktop$ ./a.out
8
16