所以,我最近对编译器(gcc (GCC) 4.8.3就是那个问题)在优化指针和指针方面的表现感兴趣.
最初我创建了一个简单的整数和一个整数指针,并在其上实现了操作,因此我可以将其打印出来.正如预期的那样,硬编码的所有操作都通过解除引用指针进行优化.
call __main
leaq .LC0(%rip), %rcx
movl $1, %edx
call printf
Run Code Online (Sandbox Code Playgroud)
甚至在创建一个接受int指针的函数后,取消引用并更改它仍然是完全优化的.
call __main
leaq .LC0(%rip), %rcx
movl $-1, %edx
call printf
Run Code Online (Sandbox Code Playgroud)
现在,当我将指针视为void并通过将其转换为char并取消引用来进行更改时,它实际上仍然完美地选择了(一个'额外'的mov调用,因为我最初将其视为8字节值,然后作为1指针解除引用的字节值)
call __main
movl $4, 44(%rsp)
movb $2, 44(%rsp)
leaq .LC0(%rip), %rcx
movl 44(%rsp), %eax
leal 1(%rax), %edx
call printf
Run Code Online (Sandbox Code Playgroud)
所以在我的问题上:
有关指针解除引用的编译器优化的一致性如何?什么情况下会选择保守?
如果项目中的所有指针都是使用restrict关键字声明的,那么我是否可以相信它会像"没有使用指针"一样进行优化?
(假设没有volatile案例)
Ps¹:我知道编译器通常做得很好,并且一般来说,担心帮助编译器进行微小优化的程序员是非生产性的(正如许多人在stackoverflow中指出的那样有关优化的问题).然而,我仍然对此事有好奇心.
Ps²:gcc -O3 -S -c main.c用于生成汇编代码的命令
C代码:(根据要求)
1:
#include <stdio.h>
int main (void)
{
int a = 4;
int *ap = &a;
*ap = …Run Code Online (Sandbox Code Playgroud)