Скорее всего, как говорили другие, это проблема выравнивания.Теперь есть несколько способов исправить это и протестировать.
Самый простой - использовать malloc или new для выделения буфера в куче.Malloc гарантирует, что возвращаемый указатель будет пригоден для выравнивания самого большого собственного типа данных.На 64-битных чипах Intel это будет означать, что он выровнен по 128-битному двойному.
char * buffer = malloc( n * sizeof(int) );
int * at = (int*)buffer + ndx;
Похоже, ваш оригинал +n
также был неверным.То, как вы это сделали, состояло в том, чтобы сместить char ptr на 1 байт, а не int ptr, на 4 байта.Это также может объяснить замедление, если вы копировали целые числа.Это потому, что вы могли непреднамеренно использовать целые числа, которые перекрывают одну и ту же область памяти.
Если вам нужно использовать выделение стека, и оно действительно подходит, вы также можете выровнять это. Существует функция повышения, которая, как мне кажется, тоже делает это
char cbuffer[1024+sizeof(int)];
int * ibuffer = (cbuffer / sizeof(int) + 1) * sizeof(int);
Тогда ibuffer
будет выровнено целым числом.Фактическое значение указателя может быть не таким, как для cbuffer, но в некоторых случаях оно может быть (зависит от стека во время вызова).Вторая строка - это простая математика для указателя, чтобы убедиться, что она кратна sizeof (int), что означает, что он выровнен по int.
new: Кто-нибудь может подтвердить, что new char[x]
также гарантирует выравнивание какmalloc
?