На самом деле, оба выглядят более или менее одинаково с точки зрения копирования - массив 32-битных целых по сравнению с массивом 32-битных указателей.Если вы скомпилируете как 64-битный, то указатель, вероятно, будет больше.
Кстати, если вы храните указатели, вы, вероятно, не хотите иметь экземпляр SEPARATE "bool" для каждого поля этого массива, вы?Это, конечно, будет намного медленнее.
Если вы хотите быстрое копирование, максимально уменьшите размер. Либо:
- используйте
char
вместо int
, либо - разработать пользовательский класс с битовыми манипуляциями для этого массива.Если вы представляете одно значение как два бита - бит «null» и бит «value-if-not-null», то вам потребуется 128 бит = 4 дюйма для всего этого массива из 64 значений.Это, безусловно, будет скопировано очень быстро!Но доступ к любому отдельному биту будет немного сложнее - всего на несколько циклов больше.
Хорошо, вы меня заинтересовали :) Я свернул что-то вроде этого:
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 байтов , что является хорошим улучшением по сравнению с 64 байтами с решением char array[8][8]
и 256 байтами int array[8][8]
.
Это, вероятно, так низко, как можно пойти сюда, не углубляясь в большую магию.