C++ 将对象传递到循环内部函数的最佳方法

C++ 将对象传递到循环内部函数的最佳方法,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,在while循环中,我在每次迭代中创建一个string对象。然后我创建一个新对象。对象的构造函数作为参数之一按值传递字符串,因此每个新对象都有自己的字符串副本。 有几个线程从队列中提取对象,因为队列已被填满以进行处理,每个线程从队列中获取一个对象,并对其执行任何需要执行的操作 大概是这样的: unsigned char Raw_Request_Bytes[2048] = {'\0'}; while(1) { std::string sTemp ((char *)Raw_Request_

在while循环中,我在每次迭代中创建一个string对象。然后我创建一个新对象。对象的构造函数作为参数之一按值传递字符串,因此每个新对象都有自己的字符串副本。 有几个线程从队列中提取对象,因为队列已被填满以进行处理,每个线程从队列中获取一个对象,并对其执行任何需要执行的操作

大概是这样的:

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));  
}
我这样做是因为在测试/设计时,我注意到每次创建字符串时,它的地址都是相同的,我认为如果我向字符串传递指针,那么每个对象都不会有它自己的字符串副本,而是相同的副本

我说得对吗?有更好的方法吗?我有点担心每次aprox时创建字符串副本的影响。2048个字符

我这样做是因为在测试/设计时,我注意到 我创建字符串的时候,它的地址是一样的,我想 这样每个对象就不会有自己的字符串副本,而是 如果我传递了一个指向字符串的指针,也是一样的

您可以看到在堆栈上创建的std::string,因此在循环中,它的内存地址在每次迭代中都是相同的,这并不奇怪。但您的对象将拥有它自己的字符串副本,除非MyObject持有对它的引用,这是UB。您可能会将std::string与原始的C string-char*混淆,但这就是为什么将std::string添加到语言中的关键所在—它的行为类似于普通对象,而不是指针

如果您查看此代码:

 void foo( int param );

 while( 1 ) {
     int i = 123;
     ... // do something with i
     foo( i );
 }
我的地址很可能在每次迭代中都是相同的。你不担心foo会不会得到副本吗?std::string也是这样

有更好的方法吗?我有点担心这种影响 每次使用PROX时创建字符串副本的步骤。2048个字符


首先,每次复制2048个字符不是强制性的。在您编写的std::string初始化表单中,它将复制字符串的一部分直到\0。关于您所关心的问题,如果您需要将这些字符串保留在某个位置,那么除了为它们分配内存之外别无选择。有更好的办法吗?很难说没有看到全貌。如果你需要在普通的台式电脑上存储几十个这样的字符串,这并不重要。更好的方法是编写可读且无bug的代码。仅在必要时进行微优化。

什么填充原始请求字节?这取决于MyObject使用其构造函数参数执行的操作。它应该复制字符串,在这种情况下,一切都应该正常。如果它存储了一个指向字符串的引用或指针,那么它就是一个死亡陷阱。那么基本上你想复制字符串,让每个对象都有它自己的相同字符串的副本吗?如果是这样,那么您的对象应该使用类似这样的方法来处理字符串,以确保对象只是获取一个副本,对象应该自己执行此操作,这样它就不依赖于传递给对象的内容,并且它确保有自己的copy特洛伊木马->套接字正在读取并将读取的信息放入原始请求\u BytesMike->yes,构造函数复制字符串,所以现在没有问题,我的问题是b/c,我想知道是否有更好的方法,因为复制大字符串需要一些时间