我们可以控制向量数组(c++)中元素的内存分配吗?
Posted
技术标签:
【中文标题】我们可以控制向量数组(c++)中元素的内存分配吗?【英文标题】:can we control memory allocation for elements in the vector array (c++)? 【发布时间】:2016-07-08 15:33:12 【问题描述】:我将给出以下代码来说明我的问题:
class Abc
public:
Abc(std::string &a, std::string &b, int num)
pairArray_ = std::make_pair(a,b);
num_ = num;
std::pair<std::string, std::string> pairArray_;
int num_;
;
class Bcd
public:
Bcd()
myArray_.reserve(100);
void push_back(std::string &a, std::string &b, int num)
Abc temp(a,b,num);
myArray.push_back(temp);
public:
std::vector<Abc> myArray_;
这两个类的典型用法如下:
void main()
Bcd tempExp;
std::string a;
std::string b;
int num;
tempExp.push_back(a,b,num);
从代码中我们可以看到,每次从Bcd类调用push_back
函数时,都会从Abc类分配内存,然后将其复制到向量myArray_
中。该向量将处理每个复制的Abc
对象的内存分配。如果我们将类定义放在库中,而在使用静态运行时库时将执行代码放在程序中,这可能会出现问题。我想知道如何避免从向量数组分配内存。我尝试通过在类定义中使用reserve
来避免为向量分配内存。但是,这个reserve
函数只能处理整个向量的内存分配,而不能处理其元素的内存分配。
【问题讨论】:
请避免“上课”。您的帖子中有 4 个课程,我不能绝对确定您指的是哪一个,或者每次都相同。明确说明哪个类存在于哪个二进制文件中,而不是含糊其辞。对你的问题要明确和直接,而不是“这可能是个问题”。 【参考方案1】:使用emplace_back:
void emplace_back(std::string &a, std::string &b, int num)
// no temporary created
myArray.emplace_back(a, b, num);
将一个新元素附加到容器的末尾。元素是 通过
std::allocator_traits::construct
构造,通常 使用 placement-new 在该位置构造元素 in-place 由容器提供。参数args...
被转发到 构造函数为std::forward<Args>(args)....
【讨论】:
为什么你认为这解决了“分配在错误的std库实例中”的问题?请明确。 @Yakk “分配在错误的 std 库实例中”...那是什么? OP 的问题?一个可执行文件和库静态链接到两个不同的堆:或者至少这是我从帖子的内脏中解码出来的。以上是关于我们可以控制向量数组(c++)中元素的内存分配吗?的主要内容,如果未能解决你的问题,请参考以下文章