【发布时间】:2012-06-15 04:21:28
【问题描述】:
GCC C++ 编译器通过function attributes 提供一系列扩展,例如:
int square(int) __attribute__((const));
特别是两个属性,const 和 pure,允许您声明函数的求值没有副作用并且仅取决于其参数 (const),或仅取决于其参数和全局变量 (@ 987654326@)。这允许消除公共子表达式,这可能会导致调用此类函数的次数少于在代码中编写的次数。
我的问题是这是否可以安全、正确和合理地用于虚拟成员函数:
struct Foo
{
virtual int square(int) __attribute__((pure)); // does that make sense?
};
这有什么合理的语义吗?是否允许?或者它只是被忽略了?恐怕我在 GCC 文档中找不到这个问题的答案。
这个问题的原因是有一系列编译器选项-Wsuggest-attribute,它们使 GCC 产生建议,说明可以将这些属性放置在何处以改进代码。然而,似乎最终甚至对虚拟功能也提出了这些建议,我想知道这些建议是否应该被认真对待。
【问题讨论】:
-
你能给这些属性分配一个指向函数的指针吗?如果答案是肯定的,那么它也应该适用于虚函数。
-
该死的,他们为什么要把
const和pure的(通常理解的)含义扭曲交换:( -
@MatthieuM。这是历史性的:
__attribute__((const))是很久以前添加的,当时“const”刚刚被发明,所以它没有具有普遍理解的含义,我猜有人认为将其与编程语言理论的“纯”等同起来是有道理的。较弱的__attribute__((pure))是在很久以后添加的,当时__attribute__((const))的安装基础太多,无法交换它们。 -
@Zack:我明白,如果只是
const,为什么不呢。我的主要问题是pure。一个不同的名字会很好,因为普遍理解的纯度概念是重复调用具有相同参数的相同函数应该产生相同的结果,这在此处被对全局变量的依赖所打破。 -
@MatthieuM。我不知道他们为什么选择这个名字,只是为什么他们不给它起名字
const。
标签: c++ gcc pure-virtual