Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. А>Хочется реализовать возможность установки аллокатора во new/delete, и запретить использование "штатных" new/delete.
А>но не нравится использовение delete_with_allocator() и не понятно, как тут запретить вызов "delete p";
delete p тебе надо разрешить в обоих случаях (и для класса, и для POD).
Далее в своём new тебе надо класть указатель на аллокатор перед создаваемым объектом. Т.е. в первое слово блока памяти положить указатель, далее сдвинуть указатель на размер слова и вернуть его из new.
Далее в delete вынуть из блока памяти указатель на аллокатор. Т.е. сдвинуть указатель на блок на слово назад. И вернуть блок в аллокатор.
Причём свой delete тоже оставь.
Здравствуйте, remark, Вы писали:
R>Далее в своём new тебе надо класть указатель на аллокатор перед создаваемым объектом. Т.е. в первое слово блока памяти положить указатель, далее сдвинуть указатель на размер слова и вернуть его из new.
Добавлю:
А на выравнивание забей до появления реальных проблем с данными, которые надо выравнивать больше чем выравнивание указателя...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Стандартная ошибка — ты путаешь delete expression и dealocation function. Добавь в Foo деструктор с логом в консоль, и убедись, что он не вызывается.
delete expression вызывает сначала деструктор объекта (объектов в случае delete []), а потом dealocation function для освобождения памяти — operator delete (operator delete []). В своем примере ты явно вызываешь operator delete, который есть dealocation function, забывая о деструкторе.
Проблема в том, что delete expression (в отличие от new expression) нельзя передать дополнительные параметры, т.е. нельзя написать что-то вроде
Foo *p = new (all) Foo (3);
delete (all) p;
поэтому нужно позаботится о том, чтобы в operator delete как-то получить ссылку на нужный аллокатор. remark постом выше предложил один из вариантов.
ЗЫ
Как только заработает поиск — поищи тему о placement delete — там было неплохое обсуждение на эту тему.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, remark, Вы писали:
R>>Далее в своём new тебе надо класть указатель на аллокатор перед создаваемым объектом. Т.е. в первое слово блока памяти положить указатель, далее сдвинуть указатель на размер слова и вернуть его из new.
E>Добавлю: E>А на выравнивание забей до появления реальных проблем с данными, которые надо выравнивать больше чем выравнивание указателя...
B>Стандартная ошибка — ты путаешь delete expression и dealocation function.
Ах, ну да.. спасибо.
B>поэтому нужно позаботится о том, чтобы в operator delete как-то получить ссылку на нужный аллокатор. remark постом выше предложил один из вариантов.
B>>Стандартная ошибка — ты путаешь delete expression и dealocation function. А>Ах, ну да.. спасибо.
Пожалуйста м
B>>поэтому нужно позаботится о том, чтобы в operator delete как-то получить ссылку на нужный аллокатор. remark постом выше предложил один из вариантов.
А>а какие еще могут быть варианты?
Аллокатор — глобальный объект (синглтон) к примеру....
А вообще нужно смотреть по задаче — универсального решения, увы, нет (за исключением стандартных new/delete).
Пробема в том, что в operator new ты не знаешь выравнивание создаваемого объекта. Мало того, ты предлагаешь положить в начало выровненного блока указатель на аллокатор. То есть если есть типы, выравнивание которых больше, чем у указателя, то они гарантированно попадут в невыровненную память...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, remark, Вы писали:
R>>Или используй _aligned_offset_malloc
E>Пробема в том, что в operator new ты не знаешь выравнивание создаваемого объекта.
operator new знает выравнивание, которое ему надо обеспечить, — выранивание подходящее для любого объекта.
E>Мало того, ты предлагаешь положить в начало выровненного блока указатель на аллокатор. То есть если есть типы, выравнивание которых больше, чем у указателя, то они гарантированно попадут в невыровненную память...
Здравствуйте, remark, Вы писали:
R>operator new знает выравнивание, которое ему надо обеспечить, — выранивание подходящее для любого объекта.
Ну жалко же выравнивать всё на 64 байта только потому, что бывают какие-то никому ненужные выравненные на 64 типы
Хотя на популярных платформах всё подижь то сведётся к 8 или 16 байтовому выравниванию. Вот такой вот размер указателя получится
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, remark, Вы писали:
R>>operator new знает выравнивание, которое ему надо обеспечить, — выранивание подходящее для любого объекта.
E>Ну жалко же выравнивать всё на 64 байта только потому, что бывают какие-то никому ненужные выравненные на 64 типы E>Хотя на популярных платформах всё подижь то сведётся к 8 или 16 байтовому выравниванию. Вот такой вот размер указателя получится
Если ты хочешь *и* расширенную функциональность, *и* вычислительную эффективность, *и* емкостную эффективность, то VirtualAlloc(), ALLOCATION_GRANULARITY, PAGE_SIZE тебе в руки и дальше со всеми остановками — freelist, block fragmentation, block coalescing и т.д.
Если ты готов отказаться хотя бы от одного требования из этих трёх, то всё очень просто и легко. Если нет, то уж извиняй — много хочешь...
Здравствуйте, remark, Вы писали:
R>Если ты готов отказаться хотя бы от одного требования из этих трёх, то всё очень просто и легко. Если нет, то уж извиняй — много хочешь...
R>
А теперь читаем оригинальный пост
Ы?
Просто выравнивание указателя -- это не так уж и мало, ИМХО...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском