![](/img/trans.png)
[英]constexpr const char * vs constexpr const char[]
[英]constexpr const char* in header file
是否有理由在头文件中不使用“ constexpr const char *”?
一位同事的论点是,包括此头文件的每个翻译单元都会有一个副本。
我的理解是,由于其编译时常量,因此未分配任何内存,并且在内存使用方面更像是“ #define”宏。 这是来源
TestConstExpr.h
#include <string.h>
namespace TestConstExpr
{
constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;
class TestClass
{
char arr[TIME_FORMAT_SIZE];
}
}
一位同事的论点是,包括此头文件的每个翻译单元都会有一个副本。
您的同事在技术上是正确的。 但这并不重要,因为将单元链接在一起时,多余的副本将被丢弃。
虽然,我已经看到有关动态链接的评论在某些不符合标准的系统上不一定是这种情况。
constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss"; .... sizeof(TIME_FORMAT)
这并没有实现您可能认为的那样。 它为您提供了指针的大小,而不是指向的字符串的大小。
constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;
您尝试的修复也不起作用,因为strlen
不是常数表达式。
您可以使用对字符串文字的引用来解决问题:
static constexpr auto& TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
constexpr const int TIME_FORMAT_SIZE = sizeof(TIME_FORMAT);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.