在while循环中,我在每次迭代时创建一个字符串对象。然后我创建一个新对象。对象的构造函数按值传递字符串作为参数之一(因此每个新对象都有自己的字符串副本)。 当队列被填满以处理它们时,有几个线程从队列中获取对象,每个线程从队列中获取一个对象,做它需要做的任何事情。
这样的事情:
unsigned char Raw_Request_Bytes[2048] = {'\0'};
while(1) {
std::string sTemp ((char *)Raw_Request_Bytes);
MyObject * pObj = new MyObject(sTemp);
MyQueue.Add(pObj);
memset(Raw_Request_Bytes,0,sizeof(Raw_Request_Bytes));
}
我是这样做的,因为在测试/设计的时候我注意到每次创建字符串时它的地址是相同的,我认为那时每个对象都没有自己的字符串副本但是相同的一个IF I传递了一个指向字符串的指针。
我是对的吗?有更好的方法吗?我有点担心每次创建字符串副本的影响(aprox。2048 chars)答案 0 :(得分:0)
我这样做是因为在测试/设计时我注意到了每一个 我创建字符串的时间,它的地址是相同的,我想 然后每个对象都没有自己的字符串副本但是 如果我传递了一个指向字符串的指针。
你看到在堆栈上创建了std :: string,所以在循环中它的内存地址在每次迭代时是相同的并不奇怪。但是你的对象将拥有它自己的字符串副本,除非MyObject
包含对它的引用,无论如何都是UB。您可能会将std::string
与原始C字符串 - char *
混淆,但这就是为什么std::string
添加到语言中的原因 - 它的行为与普通对象相似,而不像指针。
如果您查看此代码:
void foo( int param );
while( 1 ) {
int i = 123;
... // do something with i
foo( i );
}
i
地址在每次迭代时很可能是相同的。你不担心foo会得到一份副本吗?与std::string
有更好的方法吗?我很关心这种影响 每次创建一个字符串的副本(aprox。2048字符)
首先,每次复制2048个字符并不是强制性的。在您编写std::string
初始化的表单中,它将复制字符串的一部分直到\ 0。关于你的顾虑,如果你需要在某处保留字符串,除了为它们分配内存之外别无选择。还有更好的方法吗?没有看到全貌,很难说。如果您需要在普通台式PC上存储数十个字符串,那并不重要。更好的方法是编写可读和无错误的代码。仅在必要时进行微观优化。