一个在C++ 11某种方式gcc
可以标记功能(不是一个类的方法)作为const
告诉它是纯,并且不使用全局内存,但只有它的参数?纯函数C++ 11
我试过gcc
的__attribute__((const))
而且它是恰恰是我想要的。但是当全局内存在函数中被触及时,它不会产生任何编译时错误。
编辑1
请注意。我的意思是纯功能。 非常量函数。 GCC的属性有点混乱。纯函数只使用它们的参数。
一个在C++ 11某种方式gcc
可以标记功能(不是一个类的方法)作为const
告诉它是纯,并且不使用全局内存,但只有它的参数?纯函数C++ 11
我试过gcc
的__attribute__((const))
而且它是恰恰是我想要的。但是当全局内存在函数中被触及时,它不会产生任何编译时错误。
编辑1
请注意。我的意思是纯功能。 非常量函数。 GCC的属性有点混乱。纯函数只使用它们的参数。
你是在找constexpr
?这告诉编译器该函数可以在编译时进行评估。一个constexpr
函数必须具有文字返回和参数类型,并且主体只能使用声明和指令以及一个返回语句包含静态声明,typedefs。可以在常量表达式中调用一个constexpr
函数。
constexpr int add(int a, int b) { return a + b; }
int x[add(3, 6)];
说完看着的__atribute__((const))
含义,答案是否定的,你不能用标准C做++。使用constexpr
将达到相同的效果,但仅限于功能更为有限的一组功能。然而,只要编译后的程序的行为方式相同(as-if规则),编译器自身就无法停止这些优化。
不,不,不是,我的意思是纯粹的功能。请看我编辑。 – Cartesius00
@Martin新增更多 –
谢谢。属性'constexpr'几乎是无用的。也许让我们再等一等。也许一些其他'gcc'特定的属性可以帮助。 – Cartesius00
仅使用标准的C++ 11:
namespace g{ int x; }
constexpr int foo()
{
//return g::x = 42; Nah, not constant
return 42; // OK
}
int main()
{}
这里的另一个例子:
constexpr int foo(int blah = 0)
{
return blah + 42; // OK
}
int main(int argc, char**)
{
int bah[foo(2)]; // Very constant.
int const troll = foo(argc); // Very non-constant.
}
GCC的__attribute__(const)
的含义在GNU compiler docs如&hellip被记录;
许多函数不检查除参数外的任何值,并且除返回值外没有任何影响。基本上这比下面的
pure
属性稍微严格一些,因为函数不允许读取全局内存。
人们可能会认为函数的结果应该只取决于参数,并且函数应该没有副作用。
这允许更一般类别的比C++ 11 constexpr
,这使得功能inline
功能,限制参数和函数结果字面类型,并限制功能体的“活性”语句到一个return
语句,其中(C++ 11§7.1.5/ 3)
- 每一个构造呼叫和在初始化所述返回值(6.6.3,8.5)中使用的隐式转换应是允许的之一常量表达式(5.19)
作为一个例子,它很难(我认为不是不可能,但很难)做出一个功能constexpr
sin
函数。
但结果事项的纯度只有两方:
当知道是纯粹的,编译器可以使用的Elid已知结果的电话。
这主要是宏生成代码的优化。使用inline
函数替换宏以避免愚蠢地生成相同的子表达式。
当已知是纯粹的,程序员可以完全删除一个调用。
这只是适当的文档的问题。 :-)
因此,不是寻找一种方法来表达例如sin
在语言中,我建议只是通过宏避免代码生成,并像这样编写纯函数。
并使用constexpr
作为实际可行的功能(不幸的是,截至2012年12月,最新的Visual C++编译器尚不支持constexpr
)。
以前有一个关于the relationship between pure and constexpr
的问题。主要是,每个constexpr
功能是纯,但反之亦然。
不,不是,我的意思是纯函数,而不是常量函数。 – Cartesius00
@Martin:好吧,到目前为止,由于你的问题描述足够模糊导致两个这样的答案,所以对于回答问题有点粗鲁。 “有点”粗鲁?对不起,我的意思是,*相当*粗鲁。天啊。 –
我的问题?这个问题是针对那些了解“pure”和GCC属性的人。 – Cartesius00
也不知道你的意思,但你试过'constexpr' –
这不是。我的意思是纯粹不恒定。海湾合作委员会的属性有点混乱地命名。 – Cartesius00
我认为你需要改变你的问题,因为你有正确的属性。它不会产生你想要的警告是一个不同的问题 - 至少当你的问题是面值时。 –