Из конечно, код Дона Клагстона имеет неопределенное поведение.
Речь идет конкретно о представлении GCC указателей на функции-члены.
Вот фрагмент кода из статья о Представление функции-члена GCC (скопировано из статьи в исходном виде, а не из реального кода, даже не компилируется):
Код: Выделить всё
// GNU g++ uses a tricky space optimisation, also adopted by IBM's VisualAge and XLC.
struct GnuMFP {
union {
CODEPTR funcadr; // always even
int vtable_index_2; // = vindex*2+1, always odd
};
int delta;
};
adjustedthis = this + delta
if (funcadr & 1) CALL (* ( *delta + (vindex+1)/2) + 4)
else CALL funcadr
Проблема в том, что мне не удалось создать указатель на функцию-член, заполняющий значение дельты для мне поэкспериментировать с этим.
Я предполагал, что что-то похожее на дельту все еще существует, поскольку размер указателя функции-члена по-прежнему равен размеру двух указателей. Кроме того, по моим наблюдениям, трюк с индексом vtable применяется и сегодня.
Вот что я пробовал:
Код: Выделить всё
#include
#include
#include
void print_pointer(auto const ptr) {
alignas(alignof(ptr)) std::byte memory[sizeof(ptr)];
std::memcpy(memory, std::addressof(ptr), sizeof(ptr));
auto until_newline = int{8};
for (auto const b : memory) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/69647229/when-is-the-delta-used-in-a-member-function-pointer-on-gcc[/url]
Мобильная версия