簡體   English   中英

如何在平面和多維數組之間進行轉換而不復制數據?

[英]How to convert between flat and multidimensional arrays without copying data?

我已經將一些數據結構化為多維數組,即double[][] ,我需要將其傳遞給一個函數,該函數期望double[]的單個線性數組以及多維元數據的多維表示形式。

例如,我可能有一個3 x 5多維數組,我需要將其作為15個元素的平面數組以及height和width參數一起傳遞,以便函數知道它是3x5數組而不是5x3數組。

然后,該函數將返回一個平面數組和大小元數據,我需要使用它來將數據轉換回多維類型。

我相信平面和多維表示形式在內存中的數據布局都是完全相同的; 唯一的區別是如何執行索引操作。 因此,我想通過類型轉換進行“轉換”,而不是復制數組值。

在總大小相同的多維數組和平面數組之間進行類型轉換的最正確,最易讀的方法是什么?

我實際上知道在編譯時多維數組的維數是多少。 數組大小不是動態的。

@Maxim Egorushkin和@ypnos給出了最正確的方法: double *flat = &multi[0][0]; 它可以與任何不錯的編譯器一起正常工作。 但不幸的是,這不是有效的C ++代碼,它會調用未定義的行為。

問題是對於數組double multi[N][M]; NM是編譯時間常數表達式), &multi[0][0]是大小為M的數組的第一個元素的地址。 因此,僅對M進行指針算術是合法的。 有關更多詳細信息,請參見我的另一個問題

我認為最受歡迎的方法是:

double *flat = &multi[0][0];

這就是在C中完成的過程,並且您確實可以使用簡單的C數組進行操作。

您還可以在用例中查看std::array (在編譯時已知尺寸),但是該std::array不是多維的,因此,如果將其級聯,將失去連續的布局。

在總大小相同的多維數組和平面數組之間進行類型轉換的最正確,最易讀的方法是什么?

第一個數組元素的地址與數組的地址一致。 您可以傳遞第一個元素的地址,而無需強制轉換。

您可以使用強制轉換為對數組的引用。 這需要使用一些奇特的C ++類型語法,但作為回報,它允許使用對數組有效的所有功能,例如每個循環。

#include <iostream>

using namespace std;

int main()
{
    static constexpr size_t x = 5, y = 3;
    unsigned multiArray[x][y];
    for (size_t i = 0; i != x; ++i)
        for (size_t j = 0; j != y; ++j)
            multiArray[i][j] = i * j;

    static constexpr size_t z = x * y;
    unsigned (&singleArray)[z] = (unsigned (&)[z])multiArray[0][0];
    for (const unsigned value : singleArray)
        cout << value << ' ';
    cout << endl;

    return 0;
}

考慮到這種和其他基於強制類型轉換的方法僅適用於實際的多維數組。 如果它是一個數組數組(如unsigned **multiArray; ),則不會在連續的內存塊中分配它,並且unsigned **multiArray;無法繞過它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM