Когда дельта используется в указателе функции-члена в GCC?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда дельта используется в указателе функции-члена в GCC?

Сообщение Anonymous »

Я читал известную статью Дона Клагстона «Указатели функций-членов и самые быстрые делегаты C++», сам экспериментировал с этим материалом и не смог правильно воспроизвести случай.
Из конечно, код Дона Клагстона имеет неопределенное поведение.
Речь идет конкретно о представлении 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
Конечно, в стандарте об этом ничего не сказано. Кроме того, GCC ABI мог сильно измениться с момента написания статьи. Однако меня не интересует стандартное или определенное поведение. Меня интересует текущий ABI и то, что делает компилятор.
Проблема в том, что мне не удалось создать указатель на функцию-член, заполняющий значение дельты для мне поэкспериментировать с этим.
Я предполагал, что что-то похожее на дельту все еще существует, поскольку размер указателя функции-члена по-прежнему равен размеру двух указателей. Кроме того, по моим наблюдениям, трюк с индексом 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»