gpt4 book ai didi

c - 为什么那些函数调用没有优化?

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

我试过用 Clang 和 GCC 编译这段代码:

struct s { int _[50]; };

void (*pF)(const struct s), (*pF1)(struct s), (*pF2)(struct s *);

main()
{
struct s a;

pF2(&a);

pF(a), pF1(a);
}

结果是一样的。尽管不允许对 pF 的调用修改其唯一参数,但对象 a 会被复制以用于对 pF1 的第二次调用。这是为什么?

这是汇编输出(来自 GCC):

; main

push rbx
sub rsp, 0D0h
mov rbx, rsp
mov rdi, rsp
call cs:pF2

;create argument for pF1 call (as there the argument is modified)
;and copy the local a into it
;although it seems not needed because the local isn't futher read anyway

sub rsp, 0D0h
mov rsi, rbx
mov ecx, 19h
mov rdi, rsp
;

rep movsq
call cs:pF

;copy the local a into the argument created once again
;though the argument cannot be modified by the function pointed by pF

mov rdi, rsp
mov rsi, rbx
mov ecx, 19h
rep movsq
;

call cs:pF1
add rsp, 1A0h
xor eax, eax
pop rbx
retn

难道优化器不能看到因为 pF 指向的函数不能修改它的参数(因为它被声明为 const)所以省略最后的复制操作吗?另外,最近我看到,由于代码中没有进一步读取变量 a,它可以将其存储空间用于函数参数。

同样的代码可以写成:

; main

push rbx
sub rsp, 0D0h

mov rdi, rsp
call cs:pF2

call cs:pF

call cs:pF1
add rsp, 0D0h
xor eax, eax
pop rbx
retn

我正在使用 -O3 标志进行编译。我错过了什么吗?

即使我不调用 UB(因为函数指针默认为 NULL)也是一样的,而是像这样初始化它们:

#include <stdio.h>

struct s { int _[50]; };

extern void f2(struct s *a);

void (*pF)(const struct s), (*pF1)(struct s), (*pF2)(struct s *) = f2;

extern void f1(struct s a)
{
a._[2] = 90;
}

extern void f(const struct s a)
{
for(size_t i = 0; i < sizeof(a._)/sizeof(a._[0]); ++i)
printf("%d\n", a._[i]);
}

extern void f2(struct s *a)
{
a->_[6] = 90;

pF1 = f1, pF = f;
}

最佳答案

我不认为这种优化是合法的。您忽略的是带有 const 参数的函数类型与带有非常量参数的函数类型兼容,因此可以将改变其参数的函数分配给指针 pF。 .

这是一个示例程序:

struct s {
int x;
};

/* Black hole so that DCE doesn't eat everything */
void observe(void *);

void (*pF)(const struct s);

void test(struct s arg) {
arg.x = 0;
observe(&arg);
}

void assignment(void) {
pF = test;
}

最重要的是,参数的 const 注释不会为编译器提供有关参数存储是否被调用方改变的可靠信息。执行此优化似乎要求 ABI 要求参数存储不发生突变(或某种整体程序分析,但不要介意)。

关于c - 为什么那些函数调用没有优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35867933/

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