|
1
7
在x86-64 Linux上,每个32位参数在单独的64位寄存器中传递 (因为这正是x86-64 System V调用约定所要求的)。 调用方碰巧有零将32位参数扩展到64位寄存器中。(这不是必需的;程序中未定义的行为可能会让另一个调用者在arg传递寄存器中留下高垃圾。)
被叫方(
在32位ARM上,
被叫方看到的第一个64位参数可能是
(请注意,这可能会导致调用方在堆栈上的局部变量损坏,因为被调用方被允许删除堆栈参数。)
有关完整的详细信息,请使用编译器+编译选项查看代码的asm输出,以了解源代码中的C未定义行为到底导致了什么行为。
|
|
|
2
1
在我的系统上(x86\u 64)
这印的是8,这告诉我
无论您的
也不要申报您的
这是不可移植的,因为
因此,您的程序应该如下所示:
这是可移植的,在不同的 架构。 |
|
|
EE18 · C中字节序与尺寸组装转换的关系 1 年前 |
|
|
MagicRacoon · TSO和存储转发保证 2 年前 |
|
|
ugo_capeto · gcc使用“lea”而不是“add”` 2 年前 |
|
|
Locke · GCC和Clang奇怪的不必要堆栈使用[重复] 2 年前 |