C++ Constexpr与数组

C++ Constexpr与数组,c++,arrays,constexpr,C++,Arrays,Constexpr,考虑以下代码片段(当然,这段代码一点用处都没有,但我简化了它,只是为了演示我的问题): 如果是这种情况,那么无论params_name数组中包含多少元素,行为是否相同?如果是,那么我想知道仅仅将这些值存储在运行时构建的常规数组中以避免代码扩展是否会更有趣 提前感谢您的帮助。您的代码的一个问题是,目前未启用constexpr。您可以通过简单地使用常规数组(如 constexpr char const * const my_array[5] = { /* ... */ }; 关于你的问题: 所有的

考虑以下代码片段(当然,这段代码一点用处都没有,但我简化了它,只是为了演示我的问题):

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


提前感谢您的帮助。

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

constexpr char const * const my_array[5] = { /* ... */ };
关于你的问题:

所有的
constexpr
真正的意思是“这个值在编译时已知”

循环是否展开并变为

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

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

对!!编译器是否展开循环并不重要。当您的代码运行时,它的行为将与您编写的代码完全相同。这被称为“仿佛”规则,这意味着无论编译器做了什么优化,结果程序的行为都必须“仿佛”它做了您编写的事情(假设您的代码没有调用未定义的行为)

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

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


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

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

constexpr char const * const my_array[5] = { /* ... */ };
关于你的问题:

所有的
constexpr
真正的意思是“这个值在编译时已知”

循环是否展开并变为

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

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

对!!编译器是否展开循环并不重要。当您的代码运行时,它的行为将与您编写的代码完全相同。这被称为“仿佛”规则,这意味着无论编译器做了什么优化,结果程序的行为都必须“仿佛”它做了您编写的事情(假设您的代码没有调用未定义的行为)

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

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


总而言之:不要担心循环展开或代码复制之类的事情。现代编译器非常智能,通常会根据您的情况生成正确的代码。像这样展开循环所花费的额外内存量通常会被性能改进所抵消。除非你是在一个每个字节都很重要的嵌入式系统上,否则不要担心它。

循环会发生什么完全取决于编译器。编译器可以自由地以这种方式展开循环,但不需要这样做。编译器可以简单地生成未优化的代码。编译器可以根据编译选项执行不同的操作。C++标准允许编译器进行任何优化,只要没有优化的可观察效果。你使用的是代码> STD::数组< /C>,为什么不适当地迭代它,而不假设有5个条目?我想在这个例子中,你已经简化了,你没有任何理由。与C数组相比,std::array的优点基本上是它们适合STL容器隐喻,因此您只需了解一件事。例如,在本例中,您可以重写for-as-for(auto-param:params_-name),这是使用C数组不容易做到的。@tadman:我已经编辑了我的代码。@Ron:不过在VS2015中编译得很好!循环会发生什么完全取决于编译器。编译器可以自由地以这种方式展开循环,但不需要这样做。编译器可以简单地生成未优化的代码。编译器可以根据编译选项执行不同的操作。C++标准允许编译器进行任何优化,只要没有OBSE。
constexpr char const * const my_array[5] = { /* ... */ };