LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

И это, кстати, не делает адресацию линейной :D

Конечно не делает. Такой инкремент можно и в сегментной сделать. Только там он почти потеряет осмысленность, если ptr указывало на последний байт сегмента (результат может оказаться как в некорректном адресе, так и в начале этого сегмента, так и в начале какого-то другого). А тут - только если на последний байт памяти (0xFFFFFFFF для 32-битной).

Лулз в том, что это все ещё арифметика указателей, и ptr может быть хоть структурой с сотней полей

Не очень убедительная придирка, но ладно, можно тогда так, что б уж наверняка: next = (void*)(((intptr)ptr)+1);. Но вообще, ptr+i это синоним к (something*)(((intptr)ptr)+sizeof(*ptr)*i) за может быть мелкими исключениями. Но вот такое уже точно нежелательно к сегментной модели применять.

Исходная версия firkax, :

И это, кстати, не делает адресацию линейной :D

Конечно не делает. Такой инкремент можно и в сегментной сделать. Только там он почти потеряет осмысленность, если ptr указывало на последний байт сегмента (результат может оказаться как в некорректном адресе, так и в начале этого сегмента, так и в начале какого-то другого). А тут - только если на последний байт памяти (0xFFFFFFFF для 32-битной).

Лулз в том, что это все ещё арифметика указателей, и ptr может быть хоть структурой с сотней полей

Не очень убедительная придирка, но ладно, можно тогда так, что б уж наверняка: next = (void*)(((intptr)ptr)+1);. Но вообще, ptr+i это синоним к (something*)(((intptr)ptr)+sizeof(*ptr)*i) за может быть мелкими исключениями.