2012-12-02 48 views
6

一个在C++ 11某种方式gcc可以标记功能(不是一个类的方法)作为const告诉它是,并且不使用全局内存,但只有它的参数?纯函数C++ 11

我试过gcc__attribute__((const))而且它是恰恰是我想要的。但是当全局内存在函数中被触及时,它不会产生任何编译时错误。

编辑1

请注意。我的意思是纯功能。 非常量函数。 GCC的属性有点混乱。纯函数只使用它们的参数。

+0

也不知道你的意思,但你试过'constexpr' –

+0

这不是。我的意思是纯粹不恒定。海湾合作委员会的属性有点混乱地命名。 – Cartesius00

+1

我认为你需要改变你的问题,因为你有正确的属性。它不会产生你想要的警告是一个不同的问题 - 至少当你的问题是面值时。 –

回答

4

你是在找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规则),编译器自身就无法停止这些优化。

+0

不,不,不是,我的意思是纯粹的功能。请看我编辑。 – Cartesius00

+0

@Martin新增更多 –

+0

谢谢。属性'constexpr'几乎是无用的。也许让我们再等一等。也许一些其他'gcc'特定的属性可以帮助。 – Cartesius00

0

仅使用标准的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)

作为一个例子,它很难(我认为不是不可能,但很难)做出一个功能constexprsin函数。

但结果事项的纯度只有两方:

  • 当知道是纯粹的,编译器可以使用的Elid已知结果的电话。
    这主要是宏生成代码的优化。使用inline函数替换宏以避免愚蠢地生成相同的子表达式。

  • 当已知是纯粹的,程序员可以完全删除一个调用。
    这只是适当的文档的问题。 :-)

因此,不是寻找一种方法来表达例如sin在语言中,我建议只是通过宏避免代码生成,并像这样编写纯函数。

并使用constexpr作为实际可行的功能(不幸的是,截至2012年12月,最新的Visual C++编译器尚不支持constexpr)。


以前有一个关于the relationship between pure and constexpr的问题。主要是,每个constexpr功能是,但反之亦然。

+0

不,不是,我的意思是纯函数,而不是常量函数。 – Cartesius00

+0

@Martin:好吧,到目前为止,由于你的问题描述足够模糊导致两个这样的答案,所以对于回答问题有点粗鲁。 “有点”粗鲁?对不起,我的意思是,*相当*粗鲁。天啊。 –

+0

我的问题?这个问题是针对那些了解“pure”和GCC属性的人。 – Cartesius00