使用静态数组的 C++ 高效结构复制
C++ efficient structure copy with static arrays
我有一个包含一些数据的结构,尤其是大的静态分配数组。
数组长度并不总是完全使用。
我需要经常复制此数据(在实时循环中),因此我需要它尽可能高效。因此,我只想复制包含有用数据的数组长度。
以下是我对赋值运算符覆盖的建议。能否请您详细说明它的效率,并与我不太了解的复制和交换成语进行比较(What is the copy-and-swap idiom?)。
struct Config
{
// Assignment operator: Copy all data from other instance
Config& operator=(const Config&obj)
{
currentArrayLength = obj.currentArrayLength;
memcpy(array, obj.array, obj.currentArrayLength * sizeof(array[0]));
return *this;
}
/* Static */
static const size_t arrayLengthMax = 1000;
/* Data */
uint32_t currentArrayLength = 0;
int32_t array[arrayLengthMax];
}
copy-and-swap 惯用语一般表示你按值取参数obj
,这意味着它是由复制构造函数隐式复制的。好处是不需要在两个地方实现拷贝逻辑,只需要在拷贝构造函数中(DRY分词:不要重复自己)。然后交换 obj
和 this
的内部数据,当按值复制超出范围时,旧数据将自动销毁。
对于管理动态数据的对象,这可以在没有性能损失的情况下完成,因为 swap
对这些对象来说非常便宜,但是由于您的数组在对象本身中使用 space,您当前的实施速度更快 – 差不多快了。
我有一个包含一些数据的结构,尤其是大的静态分配数组。 数组长度并不总是完全使用。
我需要经常复制此数据(在实时循环中),因此我需要它尽可能高效。因此,我只想复制包含有用数据的数组长度。
以下是我对赋值运算符覆盖的建议。能否请您详细说明它的效率,并与我不太了解的复制和交换成语进行比较(What is the copy-and-swap idiom?)。
struct Config
{
// Assignment operator: Copy all data from other instance
Config& operator=(const Config&obj)
{
currentArrayLength = obj.currentArrayLength;
memcpy(array, obj.array, obj.currentArrayLength * sizeof(array[0]));
return *this;
}
/* Static */
static const size_t arrayLengthMax = 1000;
/* Data */
uint32_t currentArrayLength = 0;
int32_t array[arrayLengthMax];
}
copy-and-swap 惯用语一般表示你按值取参数obj
,这意味着它是由复制构造函数隐式复制的。好处是不需要在两个地方实现拷贝逻辑,只需要在拷贝构造函数中(DRY分词:不要重复自己)。然后交换 obj
和 this
的内部数据,当按值复制超出范围时,旧数据将自动销毁。
对于管理动态数据的对象,这可以在没有性能损失的情况下完成,因为 swap
对这些对象来说非常便宜,但是由于您的数组在对象本身中使用 space,您当前的实施速度更快 – 差不多快了。