gpt4 book ai didi

c - 是否允许编译器通过重新排序局部变量来优化堆栈内存使用?

转载 作者:太空狗 更新时间:2023-10-29 17:07:17 24 4
gpt4 key购买 nike

考虑以下程序:

#include <stdio.h>

void some_func(char*, int*, char*);

void stack_alignment(void) {
char a = '-';
int i = 1337;
char b = '+';
some_func(&a, &i, &b); // to prevent the compiler from removing the local variables
printf("%c|%i|%c", a, i, b);
}

它生成如下程序集(注释是我自己加的,我是程序集的新手):

$ vim stack-alignment.c
$ gcc -c -S -O3 stack-alignment.c
$ cat stack-alignment.s
.file "stack-alignment.c"
.section .rdata,"dr"
LC0:
.ascii "%c|%i|%c\0"
.text
.p2align 2,,3
.globl _stack_alignment
.def _stack_alignment; .scl 2; .type 32; .endef
_stack_alignment:
LFB7:
.cfi_startproc
subl $44, %esp
.cfi_def_cfa_offset 48
movb $45, 26(%esp) // local variable 'a'
movl $1337, 28(%esp) // local variable 'i'
movb $43, 27(%esp) // local variable 'b'
leal 27(%esp), %eax
movl %eax, 8(%esp)
leal 28(%esp), %eax
movl %eax, 4(%esp)
leal 26(%esp), %eax
movl %eax, (%esp)
call _some_func
movsbl 27(%esp), %eax
movl %eax, 12(%esp)
movl 28(%esp), %eax
movl %eax, 8(%esp)
movsbl 26(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
addl $44, %esp
.cfi_def_cfa_offset 4
ret
.cfi_endproc
LFE7:
.def _some_func; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef

如您所见,有 3 个局部变量(aib),大小分别为 1 字节、4 字节和1个字节。包括填充在内,这将是 12 字节(假设编译器对齐到 4 字节)。

如果编译器将变量的顺序更改为 (a, b, i) 会不会更有效率? ?那么只需要 8 个字节。

这里是“图形”表示:

    3 bytes unused                  3 bytes unused
vvvvvvvvvvv vvvvvvvvvvv
+---+---+---+---+---+---+---+---+---+---+---+---+
| a | | | | i | b | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+

|
v

+---+---+---+---+---+---+---+---+
| a | b | | | i |
+---+---+---+---+---+---+---+---+
^^^^^^^
2 bytes unused

是否允许编译器进行这种优化(根据 C 标准等)?

  • 如果不是(正如我认为程序集输出显示的那样),为什么?
  • 如果是,为什么上面没有发生这种情况?

最佳答案

编译器可以随意布局局部变量。它甚至不需要使用堆栈。

如果使用栈,可以将局部变量按照与声明顺序无关的顺序存储在栈上。

Is the compiler allowed to do this optimization (by the C standard etc.)?

  • If yes, why doesn't that happen above?

好吧,这是优化吗?

这还不清楚。它少用了几个字节,但这并不重要。但在某些体系结构上,如果 char 以字对齐方式存储,则读取它可能会更快。因此,将 char 并排放置至少会迫使其中之一不进行字对齐,从而使阅读速度变慢。

关于c - 是否允许编译器通过重新排序局部变量来优化堆栈内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com