c ++ 11如何将constexpr解析为汇编?

时间:2013-12-17 21:31:35

标签: c++ assembly constexpr

基本问题:

编辑:v-问题-v

class foo {
public:
    constexpr foo() { }
    constexpr int operator()(const int& i) { return int(i); }
}

性能是一个非常重要的问题。编译器如何实际编译以上内容?我知道我想要如何解决它,但规范如何实际指定它将被解决?

1)看到int类型有一个constexpr构造函数,创建一个int对象并编译从内存中直接将类型转换为代码的字节串?

2)通过调用'int的构造函数来替换对重载的任何调用,由于某些未知的原因,int没有constexpr构造函数? (内联电话。)

3)创建一个函数,调用该函数,并让该函数调用'int的consctructor?

为什么我想知道,以及我打算如何使用这些知识

编辑:v-Background only-v

我正在使用的真实库使用模板参数来决定如何在函数之间传递给定类型。也就是说,通过引用或值,因为类型的确切大小是未知的。用户有责任在我给他们的限制范围内工作,但我希望这些限制尽可能轻松和用户友好,我可以理所当然地制作它们。

我希望传递一个简单的单字节字符,在这种情况下它应该通过值传递。每次调用复制构造函数时,我不会禁止 300兆字节的庞然大物,它会执行几次重新计算的小步骤。在这种情况下,通过引用传递更有意义。我只有一个类型必须遵守的要求列表,而不是对类型可以或不可以做什么设置上限。

为什么我想知道我的问题的答案是这样我才能真诚地创建一个接受这个未知模板的函数对象,然后决定如何,何时,甚至应该复制多少对象。通过虚拟成员函数和分配有new的指针是如此需要的。如果编译器严重解决constexpr我需要知道,所以我可以抛弃这种思路和/或找到一个新思路。再一次,用户有责任在我给他们的限制范围内工作,但我希望这些限制尽可能轻松和用户友好,因为我可以很好地制作它们。

编辑:谢谢你的回答。唯一真正的问题是第二句话。现在已经回答了。其他所有如果需要更多背景,请允许我重申上述内容:

我有一个带有四个参数的模板。模板的目标是路由协议。是TCP / IP -unlikely-或节点内的节点 - 可能。前两个用于数据存储。除了每个运营商列表之外,他们没有要求。最后两个定义了数据在模板中的传递方式。默认情况下,这是参考。为了性能和使用自由,可以根据用户的要求更改这些定义以按值传递信息。

每个都需要长一个字节。对于EIGRP或类似OSFP协议的度量,它们可以是第二个模板参数可以是十几个或更多个不同变量的复合。每个人都需要非繁琐的时间来复制或重新计算。

为了便于使用,我研究了使用一个接受第三和第四个模板的函数对象来处理无法正常运行或复制的特殊情况和多态类。 的目标是强制用户从头开始重建对象。这将需要规划虚拟功能以执行深拷贝或任何数量的其他未知奇数。函数对象的用处取决于编译器如何依赖于不生成一系列函数调用。

我希望更有帮助吗?

2 个答案:

答案 0 :(得分:5)

C ++ 11标准没有说明如何将constexpr编译成机器指令。标准只是说constexpr的表达式可以用在需要编译时常量值的上下文中。任何特定编译器如何选择将其转换为可执行代码是一个实现问题。

现在一般情况下,启用优化后,您可以期望合理的编译器在运行时不执行任何代码以用于constexpr的许多用途,但实际上并没有任何保证。我不清楚你在你的例子中究竟在询问什么,所以很难就你的用例提供任何具体细节。

答案 1 :(得分:1)

constexpr表达式并不特别。对于所有意图和目的,它们基本上是const,除非它们使用的上下文是constexpr,并且所有变量/函数也是constexpr。它是实现定义编译器如何选择处理它。标准从不涉及实施细节,因为它以抽象的术语说话。