gpt4 book ai didi

C++:优化没有副作用的函数

转载 作者:IT老高 更新时间:2023-10-28 22:35:29 25 4
gpt4 key购买 nike

在 C++ 中有没有办法声明一个函数没有副作用?考虑:

LOG("message").SetCategory(GetCategory()); 

现在假设发布版本中的 LOG 宏创建了一个 NullLogEntry 对象,该对象将 SetCategory() 定义为一个空函数。所以基本上整个表达式可以(并且应该)被优化掉——除了理论上 GetCategory() 调用可能有一些副作用,所以我猜编译器不允许把它扔掉。

另一个示例可能是忽略部分(或全部)参数的函数模板特化,但由于可能的副作用,编译器不允许在调用站点保存对此类参数的评估。

我说的对吗?或者编译器可以优化掉这样的调用吗?如果没有,有没有办法提示编译器这个函数没有副作用,所以如果返回值被忽略,那么整个调用可以被跳过?

最佳答案

没有这样做的标准方法,但是一些编译器有注释可以用来达到这个效果,例如,在 GCC 中,你可以在函数中使用 __attribute_pure__ 标签(或者 __attribute__((pure))) 告诉编译器该函数是 pure (即没有副作用)。这在标准 C 库中被广泛使用,例如:

char * str = get_some_string();
for ( int i = 0; i < strlen( str ); ++i ) {
str[i] = toupper(str[i]);
}

可由编译器优化成:

char * str = get_some_string();
int __length = strlen( str );
for ( int i = 0; i < __length; ++ i ) {
str[i] = toupper(str[i]);
}

函数在string.h头文件中声明为:

extern size_t strlen (__const char *__s)
__THROW __attribute_pure__ __nonnull ((1));

其中 __THROW 是一个不抛出异常,以防它是解析函数的 C++ 编译器,并且 __nonnull((1)) 告诉编译器第一个参数不应为 null(即,如果参数为 null 并且使用了 -Wnonnull 标志,则触发警告)。

关于C++:优化没有副作用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623879/

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