【发布时间】:2019-03-04 01:47:06
【问题描述】:
我一直使用 C 中的字符串常量作为以下之一
char *filename = "foo.txt";
const char *s = "bar"; /* preferably this or the next one */
const char * const s3 = "baz":
但是,在阅读this 之后,现在我想知道,我是否应该将我的字符串常量声明为
const char s4[] = "bux";
?
请注意,建议为重复的链接问题是不同的,因为这个问题专门询问 constant 字符串。我知道类型有什么不同以及它们是如何存储的。该问题中的数组版本是 not const-qualified。这是一个简单的问题,即我是否应该将常量数组用于常量字符串与我一直使用的指针版本。这里的答案已经回答了我的问题,在 SO 和 Google 上搜索了两天并没有得到确切的答案。多亏了这些答案,我了解到当数组标记为 const 时,编译器可以做一些特殊的事情,并且确实(至少有一种)情况我现在将使用数组版本。
【问题讨论】:
-
有趣.. 作者是对的——“数组”是不同于“指针”。我会 THOUGHT 认为指针语法(例如
const char *s = "bar";)通常是“首选”。我对他的结论感到惊讶,即“数组语法”实际上更有效——使用不同的编译器,在不同的平台上。 -
确实如此。我总是尽可能使用
const char *s = "bar";。我从来没有真正想过使用 const-char 数组。两天来我一直试图找到一个可靠的答案,所以我想我必须在这里问:P。我意识到我可以将sizeof与数组版本一起使用,但这并不是很重要,至少在我目前的情况下。我想知道,根据作者的考虑,general 方法应该是什么。 -
对我来说似乎是一个微优化。
-
我有另一个我正在阅读的专业阵列版本链接,这是关于使用指针版本的开销。我现在似乎找不到它,但如果我找到了,我会回帖。还有@dbush,我敢肯定,但我不知道我是否患有强迫症或什么,但我对真正平凡的东西真的很挑剔哈哈。
-
在带有 clang-1000.11.45.5 的 Apple LLVM 10,0.0 中,如果您在
const char *ptr = "Lorum ipsum";中的*之后插入const,差异就会消失。编译器必须加载ptr的事实完全是因为它可以在编译器不可见的其他模块中进行更改。使指针const消除了这一点,编译器可以直接准备字符串的地址,而无需加载指针。
标签: c