C++ 只有空*的复制数组
我有void*,我知道它是一个数组 我有其他数组作为结构的成员。我知道它的类型和长度(它匹配void*数组) 我需要将void*数组的内容复制到结构中的其他数组 这个例子描述了我的问题: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
// 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