C++ 如何正确高效地定义字符串常量

阅读gtest.cc 代码发现 字符串常量都定义成数组的形式,为什么不定义成指针呢?

// A test filter that matches everything.
static const char kUniversalFilter[] = "*";

// The default output file for XML output.
static const char kDefaultOutputFile[] = "test_detail.xml";

//为什么不定义成更简单的指针形式呢?
static const char *kUniversalFilter2 = "*";//??

原因:

定义成数组形式,数组变量地址和字符串首地址地址一样的。

定义成指针,指针变量本身额外占8个字节(64bit)访问字符串需要先读取指针的值,性能比数组形式稍差,指针的值等于字符串的首地址。

为什么编译器不优化指针的地址和字符串一样? 因为指针的值可以变,编译器不敢优化。在VS2017 x64 Release模式下测试发现即使定义成 const char * const 的形式,编译器也没有把指针地址优化成字符串。

因此字符串常量建议都定义成数组形式。

#include <iostream>
using namespace std;
const char *p = "12345678";
const char *q = "12345678";
const char *const s = "12345678";
const char arr[] = "12345678";
const char *const t = "12345678";
int main(int argc, char **argv) {
  const char arr2[] = "12345678";//定义在栈上
  cout << (void *)&p << " " << (void *)&(*p) << endl;
  cout << (void *)&q << " " << (void *)&(*q) << endl;
  cout << (void *)&s << " " << (void *)&(*s) << endl;
  cout << (void *)arr << " " << (void *)&(*arr) << endl;
  cout << (void *)&arr << " " << (void *)&(*arr) << endl;
  cout << (void *)&arr2 << " " << (void *)&(*arr2) << endl;
  p = t;

  return 0;
}
/*
VS2017 x64 release 模式,测试结果:
00007FF7DA08D020 00007FF7DA071270
00007FF7DA08D028 00007FF7DA071270
00007FF7DA071280 00007FF7DA071270
00007FF7DA071288 00007FF7DA071288
00007FF7DA071288 00007FF7DA071288
0000002A614FF7C0 0000002A614FF7C0
*/

 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值