Когда вы read
из O_DIRECT
fd, «выравнивание пользовательского буфера и смещение файла должны быть кратны размеру логического блока файловой системы» (цитируется из open
Страница man ) в Linux.Другие среды могут иметь другие ограничения на это, и на самом деле это зависит от файловой системы.
Это не будет иметь место в общем случае с new
(если вам не повезет).
Вы должны рассмотретьиспользуя функцию posix_memalign
, если у вашей платформы она есть, или просто выделите больший буфер (BLOCK_SIZE + BUFSIZE) и используйте его часть, выровненную по размеру блока.
Если вы хотите придерживаться new
,вам нужно будет использовать новую форму размещения в сочетании с вышеописанным, но я недостаточно знаком с этим, чтобы показать, как это будет работать.
Для справки см., например, это нить на LKML или в разделе «Примечания» вышеприведенной справочной страницы.