gpt4 book ai didi

C++通过多次重复 vector 来构建数据数组

转载 作者:行者123 更新时间:2023-11-30 04:14:41 25 4
gpt4 key购买 nike

我有一个数字序列,我需要重复多次并获取重复的数据作为指向沿大小(实际上是元素计数)的数据的指针。我需要该数据以将其传递给 API。

分配内存、传递重复数据然后再次释放内存的最有效方法是什么。我目前将需要重复的序列存储在 std::vector

我的一些想法是:

// Setup code
unsigned int repeat = 30000;
std::vector<int> datavector(5, 0); // assume this would contain arbitrary numbers that needed to be repeated

// Idea 1:
{
unsigned int byte_size_step = datavector.size() * sizeof(int);
unsigned int byte_full_size = byte_size_step * repeat;
int *ptr = malloc(byte_full_size);

for(unsigned int i=0; i<repeat; i++)
{
memcpy(ptr+(i*byte_size_step), datavector.data(), byte_size_step);
}
apiFunc(ptr); // apiFunc copies the data
free(ptr)
}

// Idea 2:
{
std::vector datarepeated(datavector.size()*repeat);
for(unsigned int i=0; i<repeat; i++)
{
datarepeated.insert(datarepeated.begin()+(i*size_step), datavector.begin(), datavector.end());
}
apiFunc(datarepeated.data());
}

虽然我觉得会有一个功能或易于使用的方法来快速重复内存中的序列。我可能遗漏了什么。我个人不知道这样的事情是否可以从多线程解决方案中受益。

欢迎提供(最)有效地执行此操作的任何提示。

最佳答案

你的两个想法应该有非常相似的表现。但是,您可以通过最小化循环迭代/memcpy 调用的次数来从中挤出更多的性能,您可以通过加倍每次迭代的长度来实现.像这样:

// Setup code
const size_t repeat = 10;
int data[] = {1, 2, 3, 4, 5};
vector<int> datavec(data, data+5);

// initialize and copy initial segment
vector<int> datarepeated(datavec.size() * repeat);
memcpy(&datarepeated[0], &datavec[0], datavec.size()*sizeof(int));
size_t num_copied = datavec.size();
size_t num_total = datarepeated.size();

// double the amount copied at each iteration
while(num_copied*2 <= num_total) {
memcpy(&datarepeated[num_copied], &datarepeated[0], num_copied*sizeof(int));
num_copied *= 2;
}

// copy the final bit
if(num_copied < num_total)
memcpy(&datarepeated[num_copied], &datarepeated[0], (num_total-num_copied)*sizeof(int));

您可以在实际中看到它 here .

编辑:当然,您可以尝试改变复制方式(例如,使用 std::copyback_inserter 而不是 memcpy 正如有人在评论中建议的那样)在 while 循环中。我要表达的关键思想是重复加倍。无论您最终尝试什么,一定要基准测试

关于C++通过多次重复 vector 来构建数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com