繁体   English   中英

Constexpr和数组

[英]Constexpr and array

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

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数组中包含多少元素,其行为是否相同? 如果是,那么我想知道将这些值存储在运行时构建的常规数组中以避免代码扩展是否会更有趣?

在此先感谢您的帮助。

您的代码的一个问题是,目前std::array尚未启用constexpr。 您可以通过简单地使用常规数组来解决此问题,例如

constexpr char const * const my_array[5] = { /* ... */ };

至于你的问题:

constexpr真正的意思是“在编译时知道此值”。

循环展开并变为吗?

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

如果是这样,无论params_name数组中包含多少元素,其行为是否相同?

是! 编译器是否展开循环都没有关系。 当您的代码运行时,它的行为似乎与您编写的代码完全相同。 这被称为“假设”规则,这意味着无论编译器进行了什么优化,生成的程序都必须像您编写的一样“假设”行为(假设您的代码不会调用未定义的行为)。

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

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

总结一下:不要担心循环展开或代码重复之类的事情。 现代编译器非常聪明,通常会根据您的情况生成正确的代码。 像这样在循环展开上花费的额外内存通常通常不能被性能提升所抵消。 除非您处在每个字节都很重要的嵌入式系统上,否则不必担心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM