由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 老年工程师关于std::vector的几个问题
相关主题
which style do you prefer?弱问c++ iterator 和 pointer区别
why do we still use dynamic allocation?C++ 里push_back 一问
在子函数内开内存,返回主函数指针然后释放空间是不是很糟糕的(转载)vecot> p怎么 得到p的指针呢?
a c++ question.C++11里list迭代器判空仍然知道具体的list对象吗?
C++ vector 一边遍历一边删老年工程师转行做c++的新问题
问两个关于Emacs的c++补全问题请教:vector size in R
包含指针的类和vector的问题stack/heap corruption
[合集] 一个vector的问题vector< vector > > 怎么初始化?
相关话题的讨论汇总
话题: vector话题: pole话题: std话题: 堆上话题: load
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
我们有个类,叫Pole吧
std::vector PoleAccess::Load(...){
std::vector poles;
... 动态生成Pole对象,加入到vector里面
return poles;
}
然后,有另一个类,HPleManager,里面要这样做
std::vector* PoleManager::LoadHole(
return new std::vector(PoleAccess::Load(...));
}
1 这样的话,是不是一开始有一个vector在栈上,然后为了返回堆上的指针,把内容复
制到了堆上?
2 这个new std::vector(Pole)是move constructor还是copy?
3 但是为了把栈上的变量移动到堆上,还是得copy吧?当然,只是一个vector容器的信
息而已,真正vector内容都在堆上吧。而且,内容指向的Pole对象也都在堆上。
4 这个过程RVO负责直接优化到堆上吗?我问这个问题是因为我需要把PoleAccess::
Load返回的每一个Pole对象做一个操作SetParent(this);这样的话,如果我断开
auto all = PoleAccess::Load(...);
for(auto pP:all) pP->SetParent(this);
return new std::vector(all);
这样还可能RVO吗?
z*******h
发帖数: 346
2
我不是C++大牛,不过最近正好也碰到了同样的问题。
我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor复制
了一个object, 不是move.
你问什么不这样定义呢?
std::vector PoleManager::LoadHole(
std::vector poles = PoleAccess::Load(...);
return poles;
}
这样应该是用C++11的move semantics
你可以参照一下
https://stackoverflow.com/questions/15704565/efficient-way-to-return-a-
stdvector-in-c
我们公司的C++大牛们写的code都是return vector的,而不是pointer to vector.

【在 b***i 的大作中提到】
: 我们有个类,叫Pole吧
: std::vector PoleAccess::Load(...){
: std::vector poles;
: ... 动态生成Pole对象,加入到vector里面
: return poles;
: }
: 然后,有另一个类,HPleManager,里面要这样做
: std::vector* PoleManager::LoadHole(
: return new std::vector(PoleAccess::Load(...));
: }

h**********c
发帖数: 4120
3
std::vector 只放class ojects吧,还是和java 混了,
不能放primitive type
y**b
发帖数: 10166
4
说的对,pointer to vector,那还要vector干嘛;
容器就是设计用来避免数组和指针这类不强健的用法,
还去new个容器。


: 我不是C 大牛,不过最近正好也碰到了同样的问题。

: 我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor
复制

: 了一个object, 不是move.

: 你问什么不这样定义呢?

: std::vector PoleManager::LoadHole(

: std::vector poles = PoleAccess::Load(...);

: return poles;

: }

: 这样应该是用C 11的move semantics

: 你可以参照一下



【在 z*******h 的大作中提到】
: 我不是C++大牛,不过最近正好也碰到了同样的问题。
: 我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor复制
: 了一个object, 不是move.
: 你问什么不这样定义呢?
: std::vector PoleManager::LoadHole(
: std::vector poles = PoleAccess::Load(...);
: return poles;
: }
: 这样应该是用C++11的move semantics
: 你可以参照一下

b***i
发帖数: 3043
5
看来是copy,因为move需要std::move
那么,如果这个类的成员变量是vector poles的话,poleManager本身是另一个
类生成的singleton实例的指针,那么它的内容应该在堆上,这样的话整个过程从
PoleAcess::Load那里是在栈上生成一个vector,最后需要move到堆上吗?当然如果移
动,也不是很大数据量,因为只是这个vector自己的数据,而不是整个内容。
RVO能否知道本来为了要放到堆上而优化?

【在 z*******h 的大作中提到】
: 我不是C++大牛,不过最近正好也碰到了同样的问题。
: 我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor复制
: 了一个object, 不是move.
: 你问什么不这样定义呢?
: std::vector PoleManager::LoadHole(
: std::vector poles = PoleAccess::Load(...);
: return poles;
: }
: 这样应该是用C++11的move semantics
: 你可以参照一下

z*******h
发帖数: 346
6
https://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c
++11.html
vector变量是allocate在stack上,但是里面的东西是allocate在heap上,这样move
semantics就allocate一个新的vector object(里面就装size和一个pointer,不费内存
),但是C++11就不在heap上重新为vector里面的东西allocate memory了,它就偷偷地
把rvalue vector里面的pointer偷过来。
你的vector里面装的是指针,那么这些指针们allocate在heap上,每个再指向那些heap
上的pole们。我觉得你直接在vector里装pole不更省事吗?

【在 b***i 的大作中提到】
: 看来是copy,因为move需要std::move
: 那么,如果这个类的成员变量是vector poles的话,poleManager本身是另一个
: 类生成的singleton实例的指针,那么它的内容应该在堆上,这样的话整个过程从
: PoleAcess::Load那里是在栈上生成一个vector,最后需要move到堆上吗?当然如果移
: 动,也不是很大数据量,因为只是这个vector自己的数据,而不是整个内容。
: RVO能否知道本来为了要放到堆上而优化?

b***i
发帖数: 3043
7
好像从函数内的栈上临时变量返回然后生成堆上的也是可以RVO的,所以声明vector的
指针完全没有必要。
但是vector内部存指针好像有必要。毕竟这个vector上存的类可能有继承关系,虚函数
什么的。

-c
heap

【在 z*******h 的大作中提到】
: https://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c
: ++11.html
: vector变量是allocate在stack上,但是里面的东西是allocate在heap上,这样move
: semantics就allocate一个新的vector object(里面就装size和一个pointer,不费内存
: ),但是C++11就不在heap上重新为vector里面的东西allocate memory了,它就偷偷地
: 把rvalue vector里面的pointer偷过来。
: 你的vector里面装的是指针,那么这些指针们allocate在heap上,每个再指向那些heap
: 上的pole们。我觉得你直接在vector里装pole不更省事吗?

b***i
发帖数: 3043
8
今天问了为什么,是为了标志load过了。开始的时候,是nullptr,如果load过了,可以
是empty的,可以是有内容的。这样就区分开了。

【在 y**b 的大作中提到】
: 说的对,pointer to vector,那还要vector干嘛;
: 容器就是设计用来避免数组和指针这类不强健的用法,
: 还去new个容器。
:
:
: 我不是C 大牛,不过最近正好也碰到了同样的问题。
:
: 我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor
: 复制
:
: 了一个object, 不是move.
:
: 你问什么不这样定义呢?
:
: std::vector PoleManager::LoadHole(

l*******r
发帖数: 55
9
问题有点凌乱,粗略看了一眼,没见过用得这么绕的。如果你还要考虑多态,vector里
必须装指针的话,根据情况放unique_ptr或者shared_ptr不就好了?unique_ptr的话要
自己一个个move,不能直接靠copy vector来做。
L****8
发帖数: 3938
10
std::vector啥都能放 不过不要放bool

【在 h**********c 的大作中提到】
: std::vector 只放class ojects吧,还是和java 混了,
: 不能放primitive type

相关主题
问两个关于Emacs的c++补全问题弱问c++ iterator 和 pointer区别
包含指针的类和vector的问题C++ 里push_back 一问
[合集] 一个vector的问题vecot> p怎么 得到p的指针呢?
进入Programming版参与讨论
b***i
发帖数: 3043
11
我们是要放unique_ptr的,但是即使这样,有的时候有些函数需要返回裸指针的数组,
就要vector这样的。

【在 l*******r 的大作中提到】
: 问题有点凌乱,粗略看了一眼,没见过用得这么绕的。如果你还要考虑多态,vector里
: 必须装指针的话,根据情况放unique_ptr或者shared_ptr不就好了?unique_ptr的话要
: 自己一个个move,不能直接靠copy vector来做。

L****8
发帖数: 3938
12
为啥不能vector 是不是没有copy/move constructor
古老的c++程序猿一般都没有这个概念

【在 b***i 的大作中提到】
: 我们是要放unique_ptr的,但是即使这样,有的时候有些函数需要返回裸指针的数组,
: 就要vector这样的。

i***c
发帖数: 26
13
new std::vector(PoleAccess::Load(...)) 是 move construct,PoleAccess:
:Load的返回值没有名字,是rvalue

【在 z*******h 的大作中提到】
: 我不是C++大牛,不过最近正好也碰到了同样的问题。
: 我觉得 new std::vector(PoleAccess::Load(...)) 是copy constructor复制
: 了一个object, 不是move.
: 你问什么不这样定义呢?
: std::vector PoleManager::LoadHole(
: std::vector poles = PoleAccess::Load(...);
: return poles;
: }
: 这样应该是用C++11的move semantics
: 你可以参照一下

i********s
发帖数: 6
14
你把std::vector 想象成 int, 然后就会清楚为什么这个是没有问题的了。
详细的可看这里:https://stackoverflow.com/questions/22655059/why-it-is-ok-to
-return-vector-from-function

【在 b***i 的大作中提到】
: 我们有个类,叫Pole吧
: std::vector PoleAccess::Load(...){
: std::vector poles;
: ... 动态生成Pole对象,加入到vector里面
: return poles;
: }
: 然后,有另一个类,HPleManager,里面要这样做
: std::vector* PoleManager::LoadHole(
: return new std::vector(PoleAccess::Load(...));
: }

h**l
发帖数: 168
15
1 这样的话,是不是一开始有一个vector在栈上,然后为了返回堆上的指针,把内容复
制到了堆上?
yeah, just copy the container info from stack to heap.
2 这个new std::vector(Pole)是move constructor还是copy?
should be move as the method returns r-value.
3 但是为了把栈上的变量移动到堆上,还是得copy吧?当然,只是一个vector容器的信
息而已,真正vector内容都在堆上吧。而且,内容指向的Pole对象也都在堆上。
move constructor of the vector container is used, the container information
is copied from stack to heap, the vector elements (Pole*) are moved
4 这个过程RVO负责直接优化到堆上吗?我问这个问题是因为我需要把PoleAccess::
Load返回的每一个Pole对象做一个操作SetParent(this);这样的话,如果我断开
I doubt that RVO can do that. The container probably needs to be created on
the stack first.
BTW, you can set breakpoint in vector header or check assembly code to see
what happens.

【在 b***i 的大作中提到】
: 我们有个类,叫Pole吧
: std::vector PoleAccess::Load(...){
: std::vector poles;
: ... 动态生成Pole对象,加入到vector里面
: return poles;
: }
: 然后,有另一个类,HPleManager,里面要这样做
: std::vector* PoleManager::LoadHole(
: return new std::vector(PoleAccess::Load(...));
: }

l*******r
发帖数: 55
16

那你也只能这么做了,麻烦的就是ownership自己维护。
另外其实new一个vector看着也别扭,如果你用c++17的话,可以考虑把返回值改成std:

【在 b***i 的大作中提到】
: 我们是要放unique_ptr的,但是即使这样,有的时候有些函数需要返回裸指针的数组,
: 就要vector这样的。

y**b
发帖数: 10166
17
new容器是不是用智能指针指向容器更好啊?后者倒是常见。

【在 b***i 的大作中提到】
: 今天问了为什么,是为了标志load过了。开始的时候,是nullptr,如果load过了,可以
: 是empty的,可以是有内容的。这样就区分开了。

1 (共1页)
进入Programming版参与讨论
相关主题
vector< vector > > 怎么初始化?C++ vector 一边遍历一边删
STL/vector引用成员变量。问两个关于Emacs的c++补全问题
请问一个关于 cost of pointer的问题包含指针的类和vector的问题
一个C++ operator new的重载问题[合集] 一个vector的问题
which style do you prefer?弱问c++ iterator 和 pointer区别
why do we still use dynamic allocation?C++ 里push_back 一问
在子函数内开内存,返回主函数指针然后释放空间是不是很糟糕的(转载)vecot> p怎么 得到p的指针呢?
a c++ question.C++11里list迭代器判空仍然知道具体的list对象吗?
相关话题的讨论汇总
话题: vector话题: pole话题: std话题: 堆上话题: load