Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
К>А>>B sub_8(B arg0, A arg4)
А>>{
А>> ...
А>> if (..)
А>> {
А>> ...
А>> arg0.B::B(??); // под вопросами некие аргументы
А>> ...
А>> } else
А>> {
А>> ...
А>> arg0.B::B(????); // под вопросами некие другие чем в первом случае аргументы
А>> ...
А>> }
А>> return arg0;
А>>}
К>
А>>над первым арументом(arg0) кроме тех действий что я описал выше в функции, не происходит.
А>>тоесть он используеться именно два раза как конструктор и далее возращаеться на выходе из функции
К>Примерно так должна работать функция, возвращающая объект по значению.
К>Вызывающая сторона выделяет у себя на стеке память под временный объект и отдаёт указатель в функцию.
К>Функция в точке return (либо, если сделана оптимизация NRVO, в точке создания локального объекта) делает placement new и вызывает конструктор для данного указателя.
не совсем понял...
А>>функция очень похожа на operator<<
А>>но! меня настораживает что первый аргумент этой функции инициализируеться дважды в ней как конструктор!(и в этом я тоже на 100% уверен — именно два раза конструктор а не просто члены класса B)
К>Ну и правильно. Сколько разных объектов функция возвращает, столько разных конструкторов и вызывается.
К>Они же вызываются не вместе, а вместо друг друга. if-then-else.
да! но перед ними и после них есть определенные действия с разными переменными
А>>но извесно то что в любой оператор передаеться ссылка & на обьект, и уже повторно он врядли сможет проинициализироваться?!
А>>так же как видите функция sub_8 возращает этот же B класс
К>Я точно не смотрел, как у известных мне компиляторов выглядит конвенция вызова функций, возвращающих объект.
К>Очень может быть, что они уподобляются всяким strcpy: указатель на буфер на входе, указатель на тот же буфер на выходе.
GNU C++
обьект возращаеться через EAX
А>>в теле кода где используеться эта функция, сразу же после использования ее разворачиваеться код деструктора B класса
К>Значит, временный объект не понадобился — и тут же разрушен.
временный обьект был нужен
вот пример использование sub_8
D::somefunc()
{
B tmp2;// стековая переменная
sub_8(tmp2, m_tmp1); // m_tmp1 это обьект A член класса D
// думаю очень похоже на оператор и тогда
//вместо sub_8(tmp2, m_tmp1); было бы tmp2 << m_tmp1;
printf("%s\n", tmp2.GetStr());
tmp2.~B();
}
это то, что можно понять при дизассемблировании
А>>помогите идентифицировать функции, и если можно пример ее использования
К>Варианты сигнатур
К>
К>class B { ..... };
К>class A {
К> .....
К> static B sub8_v1(A* otherA) { return cond ? B(xxxxx) : B(yyyyy); }
К> B sub8_v2(/*this*/) { return cond ? B(xxxxx) : B(yyyyy); }
К> // для извращенцев
К> static B* sub8_v3(char* raw, A* otherA) { return cond ? new(raw)B(xxxxx) : new(raw)B(yyyyy); }
К> .....
К>};
замысловато, но тоже сильно накручено
поскольку там нет ни одного оператора new
К>void use()
К>{
К> A a;
К> A::sub8_v1(&a);
К> a.sub8_v2();
К> // для извращенцев
К> union {
К> char raw[sizeof(B)];
К> double ensure_best_alignment;
К> } buffer;
К> A::sub8_v3(buffer.raw, &a).~B();
К>}
К>
врядли это выглядело так в оригинале ))))))
я привел пример выше как это используеться
К>Ещё есть подозрения на виртуальное наследование A от B. Тогда sub8 — это, возможно, конструктор: он там довольно хитро устроен.
нет, виртуального наследование точно нет
я все более полагаюсь на то что это какойто оператор<<
но констуркторы в теле меня очень смущают