Constexpr和数组

时间:2017-11-01 20:16:45

标签: c++ arrays constexpr

考虑以下代码片段(当然这段代码根本没用,但我只是为了演示我的问题而简化它):

constexpr std::array<char*, 5> params_name
{
    "first_param",
    "second_param",
    "third_param",
    "fourth_param",
    "fifth_param"
};

int main()
{
    std::vector<std::string> a_vector;
    for (int i = 0; i < params_name.size(); ++i) {
        a_vector.push_back(params_name[i]);
    }
}

我想确定在编译期间理解for循环会发生什么。循环是否展开并成为? :

a_vector.push_back("first_param")
a_vector.push_back("second_param")
a_vector.push_back("third_param")
a_vector.push_back("fourth_param")
a_vector.push_back("fifth_param")

如果是这种情况,那么无论params_name数组中包含的元素数量是多少,行为是否相同?如果是,那么我想知道将这些值存储在运行时构建的常规数组中以避免代码扩展是否更有趣?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码存在的一个问题是,目前std::array并未启用constexpr。您可以通过简单地使用常规数组(例如

)来解决此问题
constexpr char const * const my_array[5] = { /* ... */ };

关于你的问题:

所有constexpr实际上意味着&#34;这个值在编译时已知&#34;。

  

循环是否展开并成为?

我不知道。这取决于您的编译器,体系结构,标准库实现和优化设置。我不会想太多这个。你可以确信,在合理的优化级别(-O1和-O2)下,你的编译器会权衡这样做的好处和缺点,而不是选择一个好的选择

  

如果是这种情况,那么无论params_name数组中包含的元素数量是多少,行为是否相同?

是的!编译器是否展开循环并不重要。当您的代码运行时,它的行为与您编写的内容完全相同。这被称为&#34; as-if&#34;规则,意味着无论编译器做了什么优化,结果程序都必须表现为&#34; as-if&#34;它做你写的(假设你的代码没有调用未定义的行为)。

  

可能更有趣的是将这些值存储在运行时构建的常规数组中以避免代码扩展?

如果你这样做,这些价值会从哪里来?从标准输入?从文件?如果是,则编译器无法知道它们将是什么或将有多少,因此除了进行运行时循环之外别无选择。如果不是,那么即使数组不是constexpr,编译器也可能足够聪明地弄清楚你的意思并优化程序与constexpr数组相同。

总结:不要担心循环展开或代码重复等问题。现代编译器非常智能,通常会为您的情况生成正确的代码。像这样在循环展开上花费的额外内存量通常会被性能改进所抵消。除非您在每个字节都很重要的嵌入式系统上工作,否则不要担心。

相关问题