有没有办法知道一个对象是常量对象还是常规对象,例如,考虑下面的类
class String
{
String(const char* str);
};如果用户从String创建一个常量对象,那么就没有理由复制传递的原生字符串,因为他不会对其进行任何操作,所以他唯一要做的就是获取字符串大小、字符串搜索和其他不会更改字符串的函数。
发布于 2010-06-04 05:01:14
复制有一个非常好的理由--您无法知道const char *的生存期是否与String对象的生存期相同。不,没有办法知道你正在构造一个常量对象。
发布于 2010-06-04 05:03:35
不幸的是,C++没有提供一种方法来完成您正在尝试的操作。简单地传递一个const char *并不能保证被指向的内存的生命周期。考虑一下:
char * a = new char[10];
char const *b = a;
String c (b);
delete[] a;
// c is now broken发布于 2010-06-04 05:04:17
你没有办法知道。您可以编写一个与String紧密交互的类,并创建一个指向外部缓冲区的常量字符串(通过将相应的构造函数设为私有,并使交互类成为嵌套类或String的朋友)。
如果你所关心的只是在一个可能很小的常量字符串上进行动态内存管理,你可以实现小字符串优化(也就是小对象/缓冲区优化)。它的工作方式是在string类中嵌入一个缓冲区,并将每个字符串复制到该缓冲区中,然后将每个较大的字符串复制到一个动态分配的存储中( boost::function使用相同的技术来存储小尺寸的函数对象)。
class String {
union {
char *dynamicptr;
char buffer[16];
};
bool isDynamic;
};有一些聪明的技术可以将嵌入字符串的长度存储到缓冲区本身中(将其长度存储为buffer[15]或类似的技巧)。
https://stackoverflow.com/questions/2969709
复制相似问题