Задачка на тему указателей
От: debugx Россия http://oignatov.blogspot.com
Дата: 03.06.19 09:52
Оценка:
Попалась такая задачка про указатели:
struct A
{
    void foo() const { }
    char pad0[32];
};

struct B
{
    void bar() const { }
    char pad2[64];
};
struct C: A, B {};

int main()
{
    auto print = [](void (C::*ptr)() const)
    {
        void *data[2];
        std::cout << static_cast<std::ptrdiff_t*>(std::memcpy(data, &ptr, sizeof(ptr)))[1];
    };
    print(&C::foo);
    std::cout << " and ";
    print(&C::bar);
    std::cout << "\n";
}


Кто-нибудь может объяснить, почему будет такой вывод в консоль?
Re: Задачка на тему указателей
От: reversecode google
Дата: 03.06.19 10:04
Оценка:
наследование
каждый объект располагается друг за другом
и функции само собой потому что обращаются через зис
Re: Задачка на тему указателей
От: B0FEE664  
Дата: 03.06.19 12:01
Оценка: +4
Здравствуйте, debugx, Вы писали:

D>Попалась такая задачка про указатели:

D>
D>struct A
D>{
D>    void foo() const { }
D>    char pad0[32];
D>};

D>struct B
D>{
D>    void bar() const { }
D>    char pad2[64];
D>};
D>struct C: A, B {};

D>int main()
D>{
D>    auto print = [](void (C::*ptr)() const)
D>    {
D>        void *data[2];
D>        std::cout << static_cast<std::ptrdiff_t*>(std::memcpy(data, &ptr, sizeof(ptr)))[1];
D>    };
D>    print(&C::foo);
D>    std::cout << " and ";
D>    print(&C::bar);
D>    std::cout << "\n";
D>}
D>


D>Кто-нибудь может объяснить, почему будет такой вывод в консоль?


"Нравятся" мне такие задачи! Видимо автор ожидает, что ответ будет: "программа напечатает 0 и 32, потому, что это смещения функций объекта типа C". Такой ответ является ошибкой. Фактически даже нет гарантий, что размера массива data хватит, чтобы сохранить sizeof(ptr) байтов, не говоря уж о том, чтобы достоверно сказать, что будет выведено в консоль. Например здесь я наблюдаю вывод 140698833649664 and 32, если запускать с vc++ компилятором.
И каждый день — без права на ошибку...
Re: Задачка на тему указателей
От: AeroSun  
Дата: 03.06.19 12:26
Оценка: +2
Здравствуйте, debugx, Вы писали:

D>Кто-нибудь может объяснить, почему будет такой вывод в консоль?


Кто-нибудь вообще может объяснить почему такой код вообще приходит в голову кому-то писать?
Re[2]: Задачка на тему указателей
От: reversecode google
Дата: 03.06.19 12:31
Оценка:
AS>Кто-нибудь вообще может объяснить почему такой код вообще приходит в голову кому-то писать?

так вопрос как обычно не в коде
а в умении понимать что там происходит
вот если чел не знает что такое лямбды
то даже не сможет сообразить что это и как
так что вопрос даже не в том что он там выведет
даже если виртуальные функции наворотить
Re: Задачка на тему указателей
От: watchmaker  
Дата: 03.06.19 12:32
Оценка:
Здравствуйте, debugx, Вы писали:

D>Попалась такая задачка про указатели.


С точки зрения С++ задача плохая — она завязана на ABI, который не описывается в C++. И в общем случае поведение не определено.

Но, например, возможное расположение структур в памяти описывается в Itanium C++ ABI, которое действует почти везде (кроме windows):
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#member-pointers — в его рамках можно получить ответ.
Re[3]: Задачка на тему указателей
От: AeroSun  
Дата: 03.06.19 19:47
Оценка: +3
Здравствуйте, reversecode, Вы писали:

R>так вопрос как обычно не в коде

R>а в умении понимать что там происходит
R>вот если чел не знает что такое лямбды
R>то даже не сможет сообразить что это и как
R>так что вопрос даже не в том что он там выведет
R>даже если виртуальные функции наворотить

Говнокод там происходит, самый типичный.
И это ничем не прикрыть.
В любом рабочем проекте эта хрень автоматом будет удаляться любым специалистом.
И не в лямбдах тут дело — они простые как палка, примеров на понимание можно сотнями генерить в реалтайме.
Re[4]: Задачка на тему указателей
От: reversecode google
Дата: 03.06.19 20:03
Оценка:
AS>Говнокод там происходит, самый типичный.

смысл не в говнокоде
а в том что бы оценить понимает человек что ему показали и какой результат может ожидаться
или не понимает
Re[5]: Задачка на тему указателей
От: landerhigh Пират  
Дата: 08.06.19 19:46
Оценка:
Здравствуйте, reversecode, Вы писали:

R>смысл не в говнокоде

R>а в том что бы оценить понимает человек что ему показали

Показали говнокод.

R>и какой результат может ожидаться


Соответствующий.
www.blinnov.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.