是否有理由在头文件中不使用“ 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];
}
}
答案 0 :(得分:4)
一位同事的论点是,包括该头文件的每个翻译单元都会有一个副本。
您的同事在技术上是正确的。但这并不重要,因为当单元链接在一起时,多余的副本就会被丢弃。
尽管如此,我已经看到一些评论,涉及动态链接时,在某些不符合标准的系统上不一定是这种情况。
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);