"?-6ren"> "?-我习惯于使用 __attribute__((nonnull))表达不应为空的指针时。 void f(int* ptr) __attribute__((nonnull)); int main(){ -6ren">
gpt4 book ai didi

c++ - 我什么时候使用 "__attribute__((nonnull))"与 "not_null"?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:54 26 4
gpt4 key购买 nike

我习惯于使用 __attribute__((nonnull))表达不应为空的指针时。

void f(int* ptr) __attribute__((nonnull));

int main(){
int* ptr = new int(1);
f(ptr);
}
void f(int* ptr){/*impl*/}

但是,对于 GSL,还有 not_null<T*>包装类型。
void function1(gsl::not_null n);

void f(gsl::not_null<int*> n);

int main(){
int* ptr = new int(1);
f(ptr);
}
void f(gsl::not_null<int*> n){/*impl*/}

假设语言设施支持 GSL 版本,我是否应该始终使用 not_null<T*>代替 __attribute__((nonnull))现在?

我的印象是编译器属性可能有助于优化,但包装器版本解析为未属性指针。

最佳答案

"should I always be using not_null in place of attribute((nonnull)) now?

not_null 似乎是更好的方法,原因如下:

__attribute__((nonnull))似乎是特定于 gcc 的,所以这意味着只有 gcc 可以将此属性用于优化、安全、安全、静态代码分析器(等等,你的名字)。如果您想使用多个编译器,这就不是一个很好的选择。例如,微软有 __assume可用于实现类似的结果。

gsl::not_null不是标准模板库的一部分,因此不能保证它能以相同的方式在所有编译器上工作。您可能会发现在某些编译器上它不会做任何特别的事情。然而,这是一个更好的选择,因为 not_null 可以包装所有编译器变体以实现相同的结果(也可以添加运行时检查)。但从当前的实现来看(参见链接),仅支持使用 __assume 的 Microsoft 编译器(找不到 gcc 的实现,但如果你有,那么使用它是一个优势)

关于c++ - 我什么时候使用 "__attribute__((nonnull))"与 "not_null<T*>"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641514/

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