gpt4 book ai didi

C++ 转换指针数组(没有数据丢失或过度使用内存)

转载 作者:行者123 更新时间:2023-11-28 01:41:06 25 4
gpt4 key购买 nike

例如,我有一个类,它存储一个非常大的某种数据类型 (__type) 数组作为指针。但是,我希望使用不同的类型来初始化此类的对象。我的代码可以浓缩为以下:

template <typename __type> class MyStorageClass {
private:
__type* _data;
public:
template <typename __alt> MyStorageClass(int size, __alt* data) { // some init function }
extern friend print() const; // print to the screen
}

如果我创建 MyStorageClass<int> 的对象,这会很好用并将其初始化为 (new int[2] { 1, 2 }) .但是,如果我尝试将其初始化为:(new float[2] { 1, 2 }),就会出现问题。 , 即使大小为 intfloat是相同的(因此理论上它们会相互转换)。

  1. 如果我通过以下方式初始化它:_data = (__type*) data; , 元素发生变化。

    MyStorageClass<int> msc1(2, new float[2] { 1, 2 });
    msc1.print();

    产量:msc1=[1065353216, 1073741824] , 不是 msc1=[1, 2]

  2. 如果我通过 for 循环初始化它:

    // some init function
    _data = new __type[size];
    for (int i = 0; i < size; i++) _data[i] = data[i];

    这有效,并正确定义了对象。但是,它会在内存中创建一个与 &_data 大小相同的新数组(在 sizeof(data) 处)。 , 而不是在 &data 处使用已经分配的内存,这是不必要的内存密集型,可能会让用户感到困惑。

问题:有没有办法使用相同的内存地址转换数组(从 float*int* 或其他数据类型)?

更新:尝试 union 失败。

union FloatIntUnion{
float _f;
int _i;
FloatIntUnion(int i) { _i = i; }
FloatIntUnion(float f) { _f = f; }
operator float() { return _f; }
operator int() { return _i; }
operator std::string() const { std::stringstream oss; oss << _f; return oss.str(); }
};

MyStorageClass<int> msc2(2, new FloatIntUnion[2]{ float(1), float(2) });
msc2.print();

产量:msc1=[1065353216, 1073741824]

最佳答案

即使 int(1)float(1) 具有相同的值,存储在内存中的位模式也完全不同。

当你执行 (int*) data; 告诉编译器位模式是相同的,但是正如你在打印它们时看到的那样,它们不是.

所以这是行不通的。

在选项 2 的循环中,赋值 _data[i] = data[i]; 不仅复制 4 个字节,它还转换位模式 floatint

关于C++ 转换指针数组(没有数据丢失或过度使用内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47112664/

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