Информация об изменениях

Сообщение Re[6]: Приведение базового класса в конструкторе потомка от 03.09.2019 22:17

Изменено 03.09.2019 22:17 Mystic Artifact

Re[6]: Приведение базового класса в конструкторе потомка
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Э-э-э... А как он тогда с другими параметрами и возвращаемыми значениями обращается?

ЕМ>Тут больше похоже на то, что когда-то просто облажались, перепутав где-то в таблицах признаки объекта класса и виртуальной функции, а когда это обнаружилось, метаться было уже поздно, и пришлось узаконить.
Я тут на godbolt-е поигрался немного:
[c++]
#include <utility>

typedef struct {
int a;
int b;
} ValueType;

class MyClass {
public:
ValueType method(int a, int b) {
ValueType v;
v.a = a;
v.b = b + a;
return v;
};

virtual ValueType virtual_method(int a, int b) {
ValueType v;
v.a = a;
v.b = b + a;
return v;
};

static ValueType static_method(int a, int b) {
ValueType v;
v.a = a;
v.b = b + a;
return v;
};
};

int foo(int a, int b) {
MyClass* x = new MyClass();
auto v1 = x->method(a, b);
auto v2 = x->virtual_method(b, a);
auto v3 = MyClass::static_method(a, b);
return v1.a + v2.b + v3.a * v3.b;
}
[/c++]
Как бы я не извращался — результат в rax. На clang тоже в rax.
Пример левой пяткой писан, потому, что он мне internal service error почему-то выдавал постоянно, пока его не "передернешь" с -O2 на -O0 и/или назад.
Примечательно, что при -O2 clang всё это выбрасывает нафиг, оставляя суть, а msvc не особо торопиться что-то выбрасывать.
Re[6]: Приведение базового класса в конструкторе потомка
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Э-э-э... А как он тогда с другими параметрами и возвращаемыми значениями обращается?

ЕМ>Тут больше похоже на то, что когда-то просто облажались, перепутав где-то в таблицах признаки объекта класса и виртуальной функции, а когда это обнаружилось, метаться было уже поздно, и пришлось узаконить.

Я тут на godbolt-е поигрался немного:

#include <utility>

typedef struct {
    int a;
    int b;
} ValueType;

class MyClass {
    public:
    ValueType method(int a, int b) {
        ValueType v;
        v.a = a;
        v.b = b + a;
        return v;
    };

    virtual ValueType virtual_method(int a, int b) {
        ValueType v;
        v.a = a;
        v.b = b + a;
        return v;
    };

    static ValueType static_method(int a, int b) {
        ValueType v;
        v.a = a;
        v.b = b + a;
        return v;
    };
};

int foo(int a, int b) {
  MyClass* x = new MyClass();
  auto v1 = x->method(a, b);
  auto v2 = x->virtual_method(b, a);
  auto v3 = MyClass::static_method(a, b);
  return v1.a + v2.b + v3.a * v3.b;
}


Как бы я не извращался — результат в rax. На clang тоже в rax.
Пример левой пяткой писан, потому, что он мне internal service error почему-то выдавал постоянно, пока его не "передернешь" с -O2 на -O0 и/или назад.
Примечательно, что при -O2 clang всё это выбрасывает нафиг, оставляя суть, а msvc не особо торопиться что-то выбрасывать.