制作指向已分配内存的C ++向量

大卫

我正在使用一些较旧的代码,该代码会分配一​​块RAM,然后将一个二进制文件加载到其中。二进制文件是X尺寸为Y的一系列8位灰度图像平面,Z深度为Z平面。文件通常在500兆字节和10千兆字节之间。

现有代码使用复杂的指针布置来访问XY,XZ或YZ平面中的各个平面。

我想做的是将指针替换为单个矢量,其中每个子矢量都是数据中的XY平面。这样做的目的是为了获得一些安全性,并检查使用向量获得的安全性,而不使用原始指针访问。

基于这个先前的问题(是否可以在已分配的内存上初始化std :: vector?)我有以下代码

//preallocate.h
template <typename T>
class PreAllocator
{
private:
T* memory_ptr;
std::size_t memory_size;

public:
typedef std::size_t     size_type;
typedef T*              pointer;
typedef T               value_type;

PreAllocator(T* memory_ptr, std::size_t memory_size) : memory_ptr(memory_ptr), memory_size(memory_size) {}

PreAllocator(const PreAllocator& other) throw() : memory_ptr(other.memory_ptr), memory_size(other.memory_size) {};

template<typename U>
PreAllocator(const PreAllocator<U>& other) throw() : memory_ptr(other.memory_ptr), memory_size(other.memory_size) {};

template<typename U>
PreAllocator& operator = (const PreAllocator<U>& other) { return *this; }
PreAllocator<T>& operator = (const PreAllocator& other) { return *this; }
~PreAllocator() {}


pointer allocate(size_type n, const void* hint = 0) {return memory_ptr;}
void deallocate(T* ptr, size_type n) {}

size_type max_size() const {return memory_size;}
};

简化后的主要功能如下:

TOMhead header;
uint8_t* TOMvolume;
size_t volumeBytes = 0;

int main(int argc, char *argv[])
{
    std::fstream TOMfile;
    std::ios_base::iostate exceptionMask = TOMfile.exceptions() | std::ios::failbit| std::ifstream::badbit;
    TOMfile.exceptions(exceptionMask);

    try {
        TOMfile.open(argv[1],std::ios::in|std::ios::binary);
    }
    catch (std::system_error& error) {
        std::cerr << error.code().message() << std::endl;
        return ERROR;
    }

    TOMfile.read((char*) &header, sizeof(header));
    if (!TOMfile)
    {
        std::cout<<"Error reading file into memory, expected to read " << sizeof(header) << " but only read " << TOMfile.gcount() << "bytes" <<std::endl;
        return ERROR;
    }


    TOMfile.seekg(std::ios_base::beg);      // rewind to begining of the file
    TOMfile.seekg(sizeof(header));          // seek to data beyond the header

    volumeBytes = (header.xsize * header.ysize * header.zsize);

    std::cout << "Trying to malloc " << volumeBytes << " bytes of RAM" << std::endl;

    TOMvolume = (uint8_t*) malloc(volumeBytes);
    if (TOMvolume == NULL)
    {
        std::cout << "Error allocating RAM for the data" << std::endl;
        return ERROR;
    }
TOMfile.read((char*) TOMvolume,volumeBytes);

我尝试过使用预分配器创建一个向量来保存此malloc分配的数据

std::vector<uint8_t, PreAllocator<uint8_t>> v_TOMvolume(0, PreAllocator<uint8_t>(&TOMvolume[0], volumeBytes));
v_TOMvolume.push_back(volumeBytes);

但任何尝试读取向量大小或向量中任何数据的尝试均会失败。当我只是使用调试器查看数据时,数据在内存中是正确的,就像我想要的那样,它并没有与向量关联。

有什么想法吗?我想做的事可能吗?

埃雷里卡

在保留存储器的先前内容的同时,不可能将存储器分配给向量。

工作方法:

  • 根本不要使用malloc。
  • 使用默认的分配器创建一个带有必要大小的向量。
  • 将二进制文件直接加载到向量中。

在假设的情况下,您无法触摸分配部分,因为它位于库的深处:只需不要使用向量。您已经有一个动态数组。基于迭代器的算法可以很好地与指针配合使用。对于基于范围的算法,您需要类似std::span(C ++ 20)或类似的东西。

但是使用向量进行分配会更安全,因此会更好。

如果您的文件最大为10 GB,那么我建议尝试使用内存映射文件。映射的内存也不能用作向量的存储,因此应采用不使用向量的方法。但是不幸的是,没有标准的方法来存储映射文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

管理向量分配的内存

来自分类Dev

C++ 的向量如何分配内存

来自分类Dev

指向向量内存丢失的指针

来自分类Dev

C ++向量化向量

来自分类Dev

向量C ++向量的大小

来自分类Dev

C ++“向量的向量”

来自分类Dev

C ++向量向量的问题

来自分类Dev

向量分配和内存使用

来自分类Dev

优化向量分配C ++

来自分类Dev

指向向量元素的C ++指针,元素已删除

来自分类Dev

指向向量元素的C ++指针,元素已删除

来自分类Dev

将向量分配给向量的向量时向量越界

来自分类Dev

C ++将向量的向量元素推入向量

来自分类Dev

在向量C ++的向量中删除向量

来自分类Dev

指向对象的指针向量C ++

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

在C ++中迭代向量的向量

来自分类Dev

C ++向量动态内存重新分配/删除

来自分类Dev

C语言中指针向量的内存分配

来自分类Dev

类对象的C ++向量和动态内存分配

来自分类Dev

C ++向量动态内存重新分配/删除

来自分类Dev

C中具有动态内存分配的指针向量

来自分类Dev

在C ++中初始化向量时,能否为向量分配大的内存块

来自分类Dev

如何过滤向量并返回指向向量元素的指针的向量

来自分类Dev

存储指向整数向量向量元素的指针向量

来自分类Dev

删除指向向量的指针

来自分类Dev

如何指向向量元素?

来自分类Dev

将向量指向数组

来自分类Dev

动态分配结构向量的内存