Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
如何使gcc在生成.data节时忽略填充?_C_Gcc - Fatal编程技术网

如何使gcc在生成.data节时忽略填充?

如何使gcc在生成.data节时忽略填充?,c,gcc,C,Gcc,以下代码: #include <stdint.h> uint8_t byte = 0x12; uint16_t word = 0x1234; int main(int argc, char *argv[]) { return 0; } 我们如何确保byte为1字节,即使它使内存未对齐?我尝试添加了#pragam pack(1),但还是一样 字节变量2字节,而不是uint8所承诺的1字节 变量为1,但编译器将其填充为2字节。请注意,这不会影响总的节大小(它仍将

以下代码:

#include <stdint.h>

uint8_t  byte = 0x12;
uint16_t word = 0x1234;

int main(int argc, char *argv[])
{

        return 0;
}
我们如何确保
byte
为1字节,即使它使内存未对齐?我尝试添加了
#pragam pack(1)
,但还是一样

字节变量2字节,而不是uint8所承诺的1字节

变量为1,但编译器将其填充为2字节。请注意,这不会影响总的节大小(它仍将对齐为2个字节)

我们如何确保字节是1字节,即使它使内存失调


你为什么要这么做?在许多平台上,这将导致编译器为内存访问生成效率低下的代码,因此,由于代码大小的增加,您将丢失从变量对齐中挤出的任何内容。如果您绝对必须使用未对齐的全局变量,请使用
\uuuu attribute\uuuu((对齐(1))

标记它们。您希望这样做的具体原因是什么?为什么要禁用它?因为我想知道
byte
变量是否用作2个字节,而不是1个字节。但是,当我尝试设置
byte=-1
时,似乎只有一个字节变为
ff
。似乎
gcc
确保了填充字节不会在所有生成的代码中使用。当然,字节变量不会使用两个字节。中间的零字节的全部用途是正确对齐变量,gcc必须确保它没有被错误使用。move
uint16\u t word=0x1234至前
uint8\u t字节=0x12
Hex dump of section '.data':
  0x00601020 00000000 00000000 00000000 00000000 ................
  0x00601030 12003412                            ..4.