И огрести кучу траблов, в частности, если класс содержит указатели. Потому что класс передается, но вызывается не дефолтный конструктор, а конструктор копирования!!! А vector - это хорошо, но тогда пользуешься в одном месте - пользуйся везде...
ну и? про адекватный конструктор копирования я написал.
vector и STL тем и хороши что можно использовать совместно со "старыми" массивами.
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
oxy писал(а):
И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...
Зачем на стек копировать указатель на функцию, адрес которой известен на этапе компиляции? Перед вызовом метода void foo(SomeClass cl) компилятор смещает указатель на вершину стека на величину sizeof(SomeClass) и затем вызывает SomeClass(const SomeClass&) в качестве this передаёт указатель на эту стековую память (может произойти срезка). И потом уже вызывается метод foo. Копированием полей занимается копи-конструктор. Не понятен смысл спора. Какая разница каким образом компилятор реализует семантику передачи по значению?
да ничего особенного не имею ввиду, просто у меня прога какая-то кривая)) И jpg тоже жмутся
главное чтобы потом расжимались, и в результате получался исходный файл.
Добавлено спустя 17 минут 58 секунд:
oxy писал(а):
И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...
а если в чистом С, мы передадим структуру по значению:
struct some_struct { ... };
void foo(struct some_struct st);
что там в стеке будет?
Obscury писал(а):
Какая разница каким образом компилятор реализует семантику передачи по значению?
точно, как там будет - детали реализации которые зависят от фантазии разработчиков компилятора и железа (теоритически возможно что в железе и самого понятия стека не будет), главно что для программиста это будет копия объекта.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Скажите пожалуйста, что это за фигня "число извлечений из стека превышает число занесений"? И почему в цикле не меняется счетчик? Причем цикл элементарный...
Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
progn писал(а):
а если в чистом С, мы передадим структуру по значению:
struct some_struct { ... };
void foo(struct some_struct st);
что там в стеке будет?
А вот тут и будет вся структура в стеке...
Добавлено спустя 1 минуту 15 секунд: manya а chh - какого типа? должна быть int.
Добавлено спустя 4 минуты 48 секунд:
Obscury писал(а):
Перед вызовом метода void foo(SomeClass cl) компилятор смещает указатель на вершину стека на величину sizeof(SomeClass) и затем вызывает SomeClass(const SomeClass&) в качестве this передаёт указатель на эту стековую память (может произойти срезка).
Ну думаю, что память то выделяется под локальную переменную SomeClass. Разница, локальная переменная, или параметр в стеке в том, что порядок переменных в стеке определён, (или переопределён ), а порядок распределения памяти под локальные переменные никто не регламентировал...
будет отличаться в зависимости от того some_struct определена как struct или как class? В одном случае будет передоватья через стек, в другом случае будет некий указатель на конструктор копирования?
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
oxy писал(а):
Ну думаю, что память то выделяется под локальную переменную SomeClass. Разница, локальная переменная, или параметр в стеке в том, что порядок переменных в стеке определён, (или переопределён ), а порядок распределения памяти под локальные переменные никто не регламентировал...
А что тут думать-то:
Код:
class A { public: A(int _x, int _y) : m_x(_x), m_y(_y), m_z(0) { }
На сколько я знаю в стандарте нет регламента на передачу указателя this. VS2008, как видно при дизассемблеровани, передаёт его через регистр ecx, а не через стек. При вызове Test(a) в качестве this выступает значение регистра esp (вершина стека):
Member
Статус: Не в сети Регистрация: 02.02.2008 Откуда: Ростов-на-Дону Фото: 3
progn писал(а):
ты хочешь сказать что в С++ заменив
Всё зависит от компилятора. Если компилить С-шным компилятором С-шный код (а какой же ещё), то скорее всего поля структуры будут передаваться через стек. Если этот же код компилять С++ компайлером, то будет код, который я приводил выше (копирование по средством копи-конструктора).
progn писал(а):
в другом случае будет некий указатель на конструктор копирования
Никакого указателя на конструктор копирования ни при каком раскладе на стек класться не будет. Потому как во время компиляции однозначно известен адрес этой функции, виртуализации здесь не может быть (максимум срезка). Ну чтоб не быть голословным:
Код:
class A { public: A(int _x) : m_x(_x), m_y(0) { }
A(const A& _a) { m_x = _a.m_x; m_y = _a.m_y; }
private: int m_x; int m_y; };
class B : public A { public: B(int _x, int _z) : A(_x), m_z(_z) { }
B(const B& _b) : A(_b) { m_z = _b.m_z; }
private: int m_z; };
void Test(A a) { }
int _tmain(int argc, _TCHAR* argv[]) { B b(1, 2); Test(b); return 0; }
Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
Obscury
Да-а. Давно я не писал ассемблерные либы к С++. Насчёт this - это, я знал. Если не изменяет память, в АСМе для С++ использовалось Prolog`овское соглашение передачи переменных. Очень многое зависит от уровня оптимизаций (иногда а+в в отладчике узнать не можешь)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения