我正在尝试制作一些结构集合,其中一些成员是一种字符串,而且字符串是昂贵的'处理我试图通过使用指针来最大化性能。
我尽力从教程中学习,但c ++中有很多不同类型的字符串。
如果值的类型为strVal
,设置char*
的最快方式是什么?
DataCollection.h
extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection);
typedef struct {
int iValue;
char* strValue;
}DataContainer;
DataCollection.cpp
extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection)
{
*Collection = (DataContainer*)LocalAlloc(0, CollectionLength * sizeof(DataContainer));
// say i need to get a record from database returning a char array
// and i use current datatype
*DataContainer CurElement = *Collection;
// iteration on each element of the collection
for(int i=0, i< CollectionLength; i++, CurElement++)
{
char* x = getsomeValuefromSystemasChar();
//.... how to assign CurElement->strValue=?
CurElement->strValue =// kind of Allocation is needed or ....just assign
//next, do i have to copy value or just assign it ?
CurElement->strValue = x or strcpy(dest,source)// if copying must take place which function would be the best?
}
}
设置CurElement
的正确和最优化方式是什么?
答案 0 :(得分:2)
对这个问题的评论和编辑使得这个答案的大部分已经过时了。我保留它纯粹是为了任何可能浏览编辑历史的人。保持有效的部分在本答复的最后。
如果,正如问题所说,结构中所有 char *
将引用的是字符串文字,那么你不需要分配内存,或者采取特殊步骤的方式分配时。
字符串文字具有静态存储持续时间,因此您只需将其地址分配给指针,一切都会正常。你不想让任何人不小心写入字符串文字,所以你通常想要使用指向const
的指针:
typedef struct {
int iValue;
char const * strValue;
} DataContainer;
然后当你需要分配时,只需指定:
extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection)
{
// ...
CurElement->strValue = "This is a string literal";
}
您可以(绝对)对具有静态存储持续时间的字符串文字进行计数,因此毫无疑问这将起作用。由于你只是指定一个指针,它也会很快。
不幸的是,它也有些脆弱 - 如果有人在这里分配字符串文字以外的东西,它可以很容易地破解。
这将我们带到下一个问题:你是否真的在处理字符串文字 。虽然您特别询问字符串文字,但您显示的演示代码看起来并不像是处理字符串文字 - 如果不是这样,那么上面的代码就会破坏。
如果必须处理,
我要说只使用std::string
。如果你坚持自己做这件事,那么你很有可能会产生破碎的东西,并且很少(几乎没有)你有机会在不破坏任何东西的情况下获得巨大的速度优势。