C++ 将对象传递到循环内部函数的最佳方法
在while循环中,我在每次迭代中创建一个string对象。然后我创建一个新对象。对象的构造函数作为参数之一按值传递字符串,因此每个新对象都有自己的字符串副本。 有几个线程从队列中提取对象,因为队列已被填满以进行处理,每个线程从队列中获取一个对象,并对其执行任何需要执行的操作 大概是这样的: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_
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,我想知道是否有更好的方法,因为复制大字符串需要一些时间