小编SSW*_*lks的帖子

编译器何时会对指针解引用优化保守,如果有的话?

所以,我最近对编译器(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)

所以在我的问题上:

  1. 有关指针解除引用的编译器优化的一致性如何?什么情况下会选择保守?

  2. 如果项目中的所有指针都是使用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)

c optimization gcc pointers dereference

5
推荐指数
1
解决办法
413
查看次数

标签 统计

c ×1

dereference ×1

gcc ×1

optimization ×1

pointers ×1