Вот использование киллера для конструктора на месте C ++: выравнивание с линией кэша, а также другие полномочия из двух границ. Вот мой сверхбыстрый алгоритм выравнивания указателя на любую мощность 2-х границ с 5-ти или менее однотактными инструкциями :
/* Quickly aligns the given pointer to a power of two boundary IN BYTES.
@return An aligned pointer of typename T.
@brief Algorithm is a 2's compliment trick that works by masking off
the desired number in 2's compliment and adding them to the
pointer.
@param pointer The pointer to align.
@param boundary_byte_count The boundary byte count that must be an even
power of 2.
@warning Function does not check if the boundary is a power of 2! */
template
inline T* AlignUp(void* pointer, uintptr_t boundary_byte_count) {
uintptr_t value = reinterpret_cast(pointer);
value += (((~value) + 1) & (boundary_byte_count - 1));
return reinterpret_cast(value);
}
struct Foo { Foo () {} };
char buffer[sizeof (Foo) + 64];
Foo* foo = new (AlignUp (buffer, 64)) Foo ();
Теперь не это просто положил улыбку на твоем лице (:-). I ♥♥♥ C ++ 1x
Причиной возникновения ошибки является то, что состояние помечается как:
type State = {
gameBoard?: Array<Array<Connect4Cell>>
}
?
знак говорит потоку, что это значение может быть неопределенным.
Как и в примере, начальное состояние установлено, и оно содержит gameBoard
в нужной форме, изменения, которые необходимо сделать, это:
type State = {
gameBoard: Array<Array<Connect4Cell>>
}
Однако, если в любое время ожидают, что компонент [live] не установлен gameBoard
, тогда решение будет состоять в том, чтобы добавить проверку перед вызовом функции .map
следующим образом
let board = this.state.gameBoard ? this.state.gameBoard.map(row => <Row />) : null;