C++ 使用括号(使用迭代器)取消引用
C++ Dereferencing with Parenthesis (with iterators)
我的问题很简单。我有一个值向量(这里的线程,无关紧要),我想遍历它们。但是,有两个版本的代码对我来说看起来相同,但只有第二个版本有效。我想知道为什么。
版本 1 (不编译)
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
*it->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
版本 2 (有效)
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
(*it)->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
这是操作顺序的问题。
*it->join();
解析为:
*(it->join());
把它当作一个挑战,我第一次在 C++11 中轻拍我的脚。我发现您可以在不动态分配std::thread
对象的情况下实现相同的目标:
#include <iostream>
#include <thread>
#include <vector>
void function()
{
std::cout << "thread functionn";
}
int main()
{
std::vector<std::thread> ths;
ths.push_back(std::move(std::thread(&function)));
ths.push_back(std::move(std::thread(&function)));
ths.push_back(std::move(std::thread(&function)));
while (!ths.empty()) {
std::thread th = std::move(ths.back());
ths.pop_back();
th.join();
}
}
这是有效的std::thread
因为构造函数和赋值运算符采用右值引用,使其可移动。此外,所有容器都获得了对存储可移动对象的支持,并且它们在重新分配时移动而不是复制它们。阅读一些关于这个新的 C++11 功能的在线文章,它太宽泛了,无法在这里解释,我也不太了解它。
关于您提出的线程具有内存成本的担忧,我认为您的方法不是优化。相反,动态分配本身在内存和性能方面都有开销。对于小型对象,一个或两个指针加上可能的一些填充的内存开销是巨大的。如果std::thread
对象只有单个指针的大小,开销超过 100%,我不会感到惊讶。
请注意,这仅涉及std::thread
对象。实际线程(尤其是其堆栈)所需的内存是一个不同的问题。但是,std::thread
对象和实际线程没有 1:1 的关系,std::thread
对象的动态分配也不会改变那里的任何内容。
如果您仍然担心重新分配太昂贵,您可以预先保留合适的大小以避免重新分配。但是,如果这确实是一个问题,那么您创建和终止线程的方式太多了,这将使移动一些小对象的开销相形见绌。请考虑使用线程池。
相关文章:
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?