C++ 只有空*的复制数组

C++ 只有空*的复制数组,c++,arrays,C++,Arrays,我有void*,我知道它是一个数组 我有其他数组作为结构的成员。我知道它的类型和长度(它匹配void*数组) 我需要将void*数组的内容复制到结构中的其他数组 这个例子描述了我的问题: // This function does not concern me - do not pay attention at memory managemt void* getObject() { uint32_t* oldArr = new uint32_t[2]; oldArr[0] = 1

我有void*,我知道它是一个数组

我有其他数组作为结构的成员。我知道它的类型和长度(它匹配void*数组)

我需要将void*数组的内容复制到结构中的其他数组

这个例子描述了我的问题:

// This function does not concern me - do not pay attention at memory managemt
void* getObject()
{
    uint32_t* oldArr = new uint32_t[2];
    oldArr[0] = 1;
    oldArr[1] = 2;

    void* obj = static_cast<void*>(oldArr);

    return obj;
};

struct ArrayStruct
{
    uint32_t dest[2];
};

int main()
{
    void* obj = getObject();
    ArrayStruct s;

    // What I need to do now is to assign values of obj to arrayStruct.dest
    // and I wonder what the best way to do it is?
}
//此函数与我无关-在内存管理时不要注意
void*getObject()
{
uint32_t*oldArr=新uint32_t[2];
oldArr[0]=1;
oldArr[1]=2;
void*obj=静态铸件(旧铸件);
返回obj;
};
结构阵列结构
{
uint32_t dest[2];
};
int main()
{
void*obj=getObject();
阵列结构;
//我现在需要做的是将obj的值赋给arrayStruct.dest
//我想知道最好的方法是什么?
}
在C++11中,我需要在不使用任何库(std除外)的情况下,在没有警告的情况下执行此操作

我有这样的实施,但这是一个警告,我怀疑它是最佳的

#include <iostream>
#include <stdint.h>

using namespace std;

// This function does not concern me - do not pay attention at memory managemt
void* getObject()
{
    uint32_t* oldArr = new uint32_t[2];
    oldArr[0] = 1;
    oldArr[1] = 2;

    void* obj = static_cast<void*>(oldArr);

    return obj;
};

struct ArrayStruct
{
    uint32_t dest[2];
};

bool GetArrayData(uint32_t arr[], void* data, uint32_t size)
{
    int length = size / sizeof(uint32_t);

    uint32_t (*array)[length] = (uint32_t (*)[length]) data;

    for(int i = 0; i < length; i++) {
        arr[i] = array[0][i];
    }

    return true;
};

int main()
{
    void* obj = getObject();
    ArrayStruct s;

    // What I need to do now is to assign values of obj to arrayStruct.dest
    // and I wonder what the best way to do it is?

    GetArrayData(s.dest, obj, sizeof(s.dest));

    cout << s.dest[0] << " " << s.dest[1];
}
#包括
#包括
使用名称空间std;
//此功能与我无关-请勿在内存管理时注意
void*getObject()
{
uint32_t*oldArr=新uint32_t[2];
oldArr[0]=1;
oldArr[1]=2;
void*obj=静态铸件(旧铸件);
返回obj;
};
结构阵列结构
{
uint32_t dest[2];
};
bool GetArrayData(uint32\u t arr[],void*数据,uint32\u t大小)
{
int length=尺寸/尺寸(uint32_t);
uint32_t(*数组)[长度]=(uint32_t(*)[长度])数据;
for(int i=0;i
我会这样做(更多信息请参见评论):


你试过memcpy吗?假设你的数组是普通的旧的blittable数据?试着重新构造/重新构造/修改你的代码以避免使用
void*
。类型系统是你的朋友-不要破坏它。也许值得一提的是
memcpy
只有在元素可以复制的情况下才有效(示例中使用的类型是)。
#include <cstring>

void GetArrayData(uint32_t arr[], void* data, uint32_t size)
{
  std::memcpy(arr, data, size * sizeof(uint32_t));
}
void GetArrayData(uint32_t arr[], uint32_t* data, uint32_t size)
{
  std::copy(data, data+size, arr);
}
#include <iostream>
#include <cstdint>
#include <algorithm>

// This function does not concern me - do not pay attention at memory managemt
void* getObject()
{
    uint32_t* oldArr = new uint32_t[2];
    oldArr[0] = 1;
    oldArr[1] = 2;

    // no need for a cast
    return oldArr;
};

struct ArrayStruct
{
    uint32_t dest[2];
};

void copy_to(ArrayStruct& as, void const* type_erased_source)
{
    // std::extent gives us the number of elements in an array
    constexpr auto elements = std::extent<decltype(as.dest)>::value;

    // cast the void* to the correct pointer type
    auto source = reinterpret_cast<std::uint32_t const*>(type_erased_source);

    // copy the objects to dest
    std::copy(source, source + elements, std::begin(as.dest));
}

int main()
{
    void* obj = getObject();
    ArrayStruct s;

    copy_to(s, obj);

    std::cout << s.dest[0] << " " << s.dest[1];
}
copy_to(ArrayStruct&, void const*):
  mov rax, QWORD PTR [rsi]
  mov QWORD PTR [rdi], rax