實際上,在複製方面它們看起來差不多 - 一個32位整數數組與32位指針數組的比較。如果你編譯爲64位,那麼指針可能會更大。
順便說一句,如果你存儲指針,你可能不希望爲該數組的每個字段都有一個「bool」的SEPARATE實例,對嗎?那肯定會慢得多。
如果你想快速複製,縮小體積儘可能,或者:的
- 使用
char
代替int
,或
- 制定一個自定義類與此陣位操作。如果你將一個值表示爲兩位 - 一個「空」位和「如果不是空的值」位,那麼你需要128位= 4位整數的64位數值。這肯定會被複製得非常快!但是訪問任何單個位會更復雜一點 - 只需要幾個週期。
OK,你讓我很好奇:)我捲起這樣的:
struct BitArray {
public:
static const int DIMENSION = 8;
enum BitValue {
BitNull = -1,
BitTrue = 1,
BitFalse = 0
};
BitArray() {for (int i=0; i<DIMENSION; ++i) data[i] = 0;}
BitValue get(int x, int y) {
int k = x+y*DIMENSION; // [0 .. 64)
int n = k/16; // [0 .. 4)
unsigned bit1 = 1 << ((k%16)*2);
unsigned bit2 = 1 << ((k%16)*2+1);
int isnull = data[n] & bit1;
int value = data[n] & bit2;
return static_cast<BitValue>((!!isnull)*-1 + (!isnull)*!!value);
}
void set(int x, int y, BitValue value) {
int k = x+y*DIMENSION; // [0 .. 64)
int n = k/16; // [0 .. 4)
unsigned bit1 = 1 << ((k%16)*2);
unsigned bit2 = 1 << ((k%16)*2+1);
char v = static_cast<char>(value);
// set nullbit to 1 if v== -1, else 0
if (v == -1) {
data[n] |= bit1;
} else {
data[n] &= ~bit1;
}
// set valuebit to 1 if v== 1, else 0
if (v == 1) {
data[n] |= bit2;
} else {
data[n] &= ~bit2;
}
}
private:
unsigned data[DIMENSION*DIMENSION/16];
};
此對象的一個8x8的陣列大小爲16個字節,這是一個很好與使用char array[8][8]
的解決方案和256字節的int array[8][8]
的解決方案的64字節相比有所改進。
這可能就像一個人可以在這裏一樣低,不用鑽研更大的魔法。
來源
2010-12-03 21:40:52
Kos
掛上,什麼?在第二種情況下`someArray [a] [b]`的值肯定是一個指針,而不是一個整數。你在談論`* someArray [a] [b]`? – 2010-12-03 21:34:01
@oli哦,你是對的,我會更新問題,謝謝! – wrongusername 2010-12-03 21:37:18
這些陣列有多大? – 2010-12-03 21:38:12