Работа с указателем как использование и ручное выравнивание - PullRequest
1 голос
/ 03 ноября 2019

Я нашел этот код в статье https://fitzgeraldnick.com/2019/11/01/always-bump-downwards.html:

let ptr = self.ptr as usize;

// Round the bump pointer up to the requested
// alignment. See the footnote for details.
let aligned = (ptr + align - 1) & !(align - 1);

let new_ptr = aligned + size;
// ...
self.ptr = new_ptr as *mut u8;

Этот небезопасный код выделяет динамическое хранилище для объектов и выполняет выравнивание адресов вручную, используя целочисленное представление адреса памяти. Я сомневаюсь, что код корректен для разных архитектур, например, на компьютерах с моделью сегментированной памяти. Поэтому у меня есть вопросы:

  1. Является ли этот код верным в Rust, и если да, то какой тип процессорной архитектуры Rust предполагает, и существует ли какое-либо формальное его определение?

  2. Можно ли сделать то же самое в C ++ без нарушения стандарта C ++? А именно, имея указатель на свободное пространство с неизвестным выравниванием, приведите его к size_t / uintptr_t и выровняйте его вручную?

...