在循环中将对象传递给函数的最佳方法

时间:2014-08-28 15:01:27

标签: c++ multithreading thread-safety

在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)

1 个答案:

答案 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上存储数十个字符串,那并不重要。更好的方法是编写可读和无错误的代码。仅在必要时进行微观优化。