仅限制函数的“out”-(指针-)参数就足够了吗?

问题描述 投票:0回答:1

假设我有一个函数,它接受一些指针参数 - 一些非常量,它可以通过它写入,一些常量,它只能通过它读取。示例:

void f(int * a, int const *b);

还假设该函数不会以其他方式写入内存(即不使用全局变量、固定地址、将 const 指针重新转换为非 const 等技巧)。

现在,为了实现

restrict
内所有读取的
f()
的好处,仅输出参数
restrict
是否足够(根据 C 语言标准)?即在示例中,限制
a
但不限制
b

一个简单测试(GodBolt)表明这样的限制应该足够了。此来源:

int f(int * restrict a, int const * b) {
    a[0] += b[0];
    return a[0] + b[0];
}

int all_restricted(int * restrict a, int const * restrict b) {
    a[0] += b[0];
    return a[0] + b[0];
}

为 x86_64 生成相同的目标代码:

f:
        mov     eax, DWORD PTR [rsi]
        mov     edx, DWORD PTR [rdi]
        add     edx, eax
        mov     DWORD PTR [rdi], edx
        add     eax, edx
        ret
all_restricted:
        mov     eax, DWORD PTR [rsi]
        mov     edx, DWORD PTR [rdi]
        add     edx, eax
        mov     DWORD PTR [rdi], edx
        add     eax, edx
        ret

但这不是一般保证。

c parameter-passing restrict function-parameter pointer-aliasing
1个回答
0
投票

指针上的

const
关键字是一个绑定承诺,即你不会(不能)修改指针指向的内存;然而,它没有说明其他人是否可能这样做。因此,我认为即使是
const
指针也可以从
restrict
关键字中受益,因为它保证该指针指向的内存不会被任何人修改。

© www.soinside.com 2019 - 2024. All rights reserved.