首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量对象和常量构造函数

常量对象和常量构造函数
EN

Stack Overflow用户
提问于 2010-06-04 04:56:33
回答 6查看 4.8K关注 0票数 5

有没有办法知道一个对象是常量对象还是常规对象,例如,考虑下面的类

代码语言:javascript
复制
class String
{
   String(const char* str);
};

如果用户从String创建一个常量对象,那么就没有理由复制传递的原生字符串,因为他不会对其进行任何操作,所以他唯一要做的就是获取字符串大小、字符串搜索和其他不会更改字符串的函数。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-04 05:01:14

复制有一个非常好的理由--您无法知道const char *的生存期是否与String对象的生存期相同。不,没有办法知道你正在构造一个常量对象。

票数 8
EN

Stack Overflow用户

发布于 2010-06-04 05:03:35

不幸的是,C++没有提供一种方法来完成您正在尝试的操作。简单地传递一个const char *并不能保证被指向的内存的生命周期。考虑一下:

代码语言:javascript
复制
char * a = new char[10];
char const *b = a;
String c (b);
delete[] a;
// c is now broken
票数 2
EN

Stack Overflow用户

发布于 2010-06-04 05:04:17

你没有办法知道。您可以编写一个与String紧密交互的类,并创建一个指向外部缓冲区的常量字符串(通过将相应的构造函数设为私有,并使交互类成为嵌套类或String的朋友)。

如果你所关心的只是在一个可能很小的常量字符串上进行动态内存管理,你可以实现小字符串优化(也就是小对象/缓冲区优化)。它的工作方式是在string类中嵌入一个缓冲区,并将每个字符串复制到该缓冲区中,然后将每个较大的字符串复制到一个动态分配的存储中( boost::function使用相同的技术来存储小尺寸的函数对象)。

代码语言:javascript
复制
class String {
  union {
    char *dynamicptr;
    char buffer[16];
  };
  bool isDynamic;
};

有一些聪明的技术可以将嵌入字符串的长度存储到缓冲区本身中(将其长度存储为buffer[15]或类似的技巧)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2969709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档