c++ - C++ 中的非连续数组指针

标签 c++ arrays pointers memory-management

我正在用 C++ 为几个线性代数库编写包装代码,这些库可能以多种格式之一存储它们的数组,最常见的是密集列优先、密集行优先、压缩稀疏列和压缩稀疏行。我想创建一个数组包装器类,它将以通用顺序访问这些数组的元素,同时维护基础库所需的底层内存顺序;也就是说,我希望能够使用基于行的索引以相同的方式访问包装的列优先密集数组和包装的行优先密集数组的元素。我无法在不干扰外部库功能的情况下对底层数组进行重新排序,并且考虑到我的数组规模巨大,重新排序将涉及大量计算成本。这就是我的意思,假设“rowMajorArray”和“columnMajorArray”都以适当的顺序为它们的外部库存储“T”类型的值:

T * data;
// Initialize values of data

rowMajorArray R(data); // Stored row-major, with reordering of data if necessary
columnMajorArray C(data); // Stored column-major, with reordering of data if necessary

wrapperArray wrapperR(R); // DOES NOT reorder data
wrapperArray wrapperC(C); // DOES NOT reorder data

assert(wrapperR[3] == wrapperC[3]); // I want this to be true, i.e. transparent row indexing
assert(wrapperR[3][4] == wrapperC[3][4]); // I want this to be true, i.e. transparent element indexing


T * rowPointerR = wrapperR[0]; // Points to first row; should this be a reference: &(wrapperR[0]) ?
T * rowPointerC = wrapperC[0]; // Points to first row, even though stored column-major

assert( *(rowPointerR + 2) == *(rowPointerC + 2) ) // I want this to be true, i.e. transparent row pointers

T * elementPointerR = &(wrapperR[0][0]); // Points to individual element
T * elementPointerC = &(wrapperC[0][0]); // Points to individual element

assert( *(elementPointerR + 2) == *(elementPointerC + 2) ) // I want this to be true, i.e. transparent pointer arithmetic

本质上,我的目标是让底层库能够使用与它们 native 使用相同的内存顺序访问包装数组,同时使我的包装器代码能够透明地访问数据,而不必担心底层内存顺序。我不在乎我是使用指针语法还是索引语法,因为我可以用任何一种来做我需要的一切,只要我能正确访问行和元素;如果我只能直接实现指针,那么无论如何我都会重载索引运算符,以便与其他外部运算符重载库轻松集成。

在此先感谢大家的帮助。

最佳答案

您只需重载索引运算符,并在所述运算符内部计算正确的偏移量。您的包装器需要知道它包装的是哪种数据结构。它可能就像在创建这些类型之一的实例时设置一些成员变量一样简单,即 m_rowOffsetm_columnOffset 等。

但是,您无法对指针的工作方式做任何事情。指针是简单、愚蠢的生物,你不能让它们以不同的方式工作来满足你的目的。如果将 1 添加到指针,它只会前进到下一个对象(即前进 n * sizeof(T) 字节)坚持使用索引方法。无论如何,它更自然。

关于c++ - C++ 中的非连续数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013444/

相关文章:

java - 反转颜色 OpenCV Java Api

c++ - 将[N]下的所有幸运数字添加到 vector 的算法?

c++ - HLSL DirectX9 : Is there a getTime() function or similar?

c++ - 来自母保护字段的非静态数据成员初始化

java - 如何在不创建新数组或不使用 ArrayLists 的情况下从数组中删除元素? java

C++:关于内存管理,指针本身是如何处理的?

C++如何删除两个相互引用的类指针

ios - 如何在两个不同数组的特定索引处组合两个数组值

java - 这个二维数组中有多少个对象?

c - 带指针的语句似乎缺少运算符