如何使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必须确保它没有被错误使用。moveuint16\u t word=0x1234代码>至前uint8\u t字节=0x12代码>
Hex dump of section '.data':
0x00601020 00000000 00000000 00000000 00000000 ................
0x00601030 12003412 ..4.