Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-强制使用_Alignas说明符对齐-为什么要填充内存?_C_Memory_Alignment_Padding - Fatal编程技术网

C-强制使用_Alignas说明符对齐-为什么要填充内存?

C-强制使用_Alignas说明符对齐-为什么要填充内存?,c,memory,alignment,padding,C,Memory,Alignment,Padding,我有一些关于C语言中内存对齐的问题,以及在使用_Alignas说明符强制将变量对齐到一定数量的字节后如何分配内存 此代码在输出中显示每个声明变量的内存地址: #include <stdio.h> int main(void) { unsigned char dx = 1; unsigned char ca = 1; unsigned char cx = 1; unsigned char dz = 1; uns

我有一些关于C语言中内存对齐的问题,以及在使用_Alignas说明符强制将变量对齐到一定数量的字节后如何分配内存

此代码在输出中显示每个声明变量的内存地址:

#include <stdio.h>

int main(void)
{
       unsigned char dx = 1;
       unsigned char ca  = 1;
       unsigned char cx  = 1;
       unsigned char dz = 1;
       unsigned char cb = 1;
       unsigned char _Alignas(double)  cz = 1;

       char * p_begin = (char *) &cz;
       char * p_end = (char * ) &dx + sizeof(dx);

       printf("Addresses   Value\n");
       for (char * p = p_begin; p < p_end; p++)
       {
              printf("%9p   %6X", p, 0xff & *p);

              if (p == (char *) & dx) printf(" <- dx\n");
              else if (p == (char *) & ca) printf(" <- ca\n");
              else if (p == (char *) & cx) printf(" <- cx\n");
              else if (p == (char *) & dz) printf(" <- dz\n");
              else if (p == (char *) & cb) printf(" <- cb\n");
              else if (p == (char *) & cz) printf(" <- cz\n");
              else printf("\n");
       }

       return 0;
}
#包括
内部主(空)
{
无符号字符dx=1;
无符号字符ca=1;
无符号字符cx=1;
无符号字符dz=1;
无符号字符cb=1;
无符号字符_Alignas(double)cz=1;
char*p_begin=(char*)&cz;
char*p_end=(char*)&dx+sizeof(dx);
printf(“地址值\n”);
对于(char*p=p_开始;p如果(p==(char*)&dx)printf("堆栈通常向下增长。这没有根本原因;这主要是历史发展的结果。为堆栈分配了一个内存区域,堆栈指针设置为指向堆栈的高端,并启动程序的主例程。由于程序需要更多的堆栈空间,因此会减少堆栈的数量国际米兰

在您的示例中出现的情况是,编译器按照遇到对象的顺序为对象分配空间。
dx
首先被看到,因此它被分配到堆栈上的下一个可用空间,
0x28ff13
。然后
ca
被看到,并且它被分配到
0x28ff12
。我们看到,随着堆栈的增长,它从较高的地址(起始位置)转到较低的地址

当编译器到达
cz
(您已请求对其进行八字节对齐)时,编译器将跳转到下一个八字节的倍数(仍然向下),即
0x28ff08

当然,编译器可以查看整个情况(而不是一次只查看一个对象)并将
cz
放在
0x28ff10
处,并将其他对象放在其周围,使用更少的堆栈空间。如果启用了优化,编译器可能会这样做。另一方面,编译器可能要求您的平台将堆栈指针对齐到八个字节(或更多),因此重新排列这些特定对象不会节省任何堆栈空间

C标准中没有关于这方面的规则。编译器可以根据自己的选择自由安排堆栈

Addresses   Value
   28ff08        1 <- cz
   28ff09       FF
   28ff0a       28
   28ff0b        0
   28ff0c       CE
   28ff0d       2A
   28ff0e       40
   28ff0f        1 <- cb
   28ff10        1 <- dz
   28ff11        1 <- cx
   28ff12        1 <- ca
   28ff13        1 <- dx

Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.