sizeof指向c中结构的指针

时间:2016-04-07 05:21:58

标签: pointers data-structures

这是结构声明

struct node
{
  int data;
  struct node *next;
};

当我执行以下行时,ptr2的大小不应该是12个字节(我使用的是64位机器)?

struct node *ptr;
  struct node ptr2;
  printf("%u\n%u\n",sizeof(ptr),sizeof(ptr2));

输出如下:

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

1 个答案:

答案 0 :(得分:-2)

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

#pragma pack(1)
struct node
 {
 int data;
 struct node *next;
 };
#pragma pack()

在您的情况下,您似乎已将对齐设置为8或16个字节。此属性用于对齐数据以通过更好地解决数学运算和更少的缓存未命中来加速内存访问...

  • #pragma pack(x)暂时将align属性设置为x个字节
  • #pragma pack()恢复上一个对齐设置。

你可以将它们视为推送和弹出。

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

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

但是很少有人在某些架构中指出禁止未对齐的内存访问(如SPARC),并且通常会导致崩溃/异常。