Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 58 из 87<  1 ... 55  56  57  58  59  60  61 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
tolikrog писал(а):
Для этого надо передавать функцию по значению


тут какая то ерунда написана. Откуда это задание?

Добавлено спустя 4 минуты 9 секунд:
Root писал(а):
И огрести кучу траблов, в частности, если класс содержит указатели. Потому что класс передается, но вызывается не дефолтный конструктор, а конструктор копирования!!!
А vector - это хорошо, но тогда пользуешься в одном месте - пользуйся везде...


ну и? про адекватный конструктор копирования я написал.

vector и STL тем и хороши что можно использовать совместно со "старыми" массивами.



Партнер
 

Member
Статус: Не в сети
Регистрация: 11.01.2009
progn писал(а):
tolikrog писал(а):
Для этого надо передавать функцию по значению


тут какая то ерунда написана. Откуда это задание?


извиняюсь, пропустил букву "в".... передавать в функцию по значению, спасибо всем за ответ.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Во сколько раз примерно сожмется jpg по алгоритму Хаффмана?

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
manya писал(а):
Во сколько раз примерно сожмется jpg по алгоритму Хаффмана?
Ни во сколько.


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
что ты имеешь ввиду?
при сжатии в jpg алгоритм Хаффмана уже используется. Если сжать второй раз, то файл скорее всего станет только больше.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
да ничего особенного не имею ввиду, просто у меня прога какая-то кривая)) И jpg тоже жмутся :lol:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
progn писал(а):
oxy
...а что тут пробовать? это элементарно:
void foo(SomeClass cl)
{
...
}

у класса должен быть адекватный конструктор копии

для тебя это откровение? :D
...


И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
oxy
Цитата:
И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...

нет.... я бы пошел на Вашем месте экспериментировать и читать спеки.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
прошу тухлыми помидорами не кидать :D Текст должен сжаться в 2 раза?

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
oxy писал(а):
И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...

Зачем на стек копировать указатель на функцию, адрес которой известен на этапе компиляции? Перед вызовом метода void foo(SomeClass cl) компилятор смещает указатель на вершину стека на величину sizeof(SomeClass) и затем вызывает SomeClass(const SomeClass&) в качестве this передаёт указатель на эту стековую память (может произойти срезка). И потом уже вызывается метод foo. Копированием полей занимается копи-конструктор.
Не понятен смысл спора. Какая разница каким образом компилятор реализует семантику передачи по значению?


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya писал(а):
да ничего особенного не имею ввиду, просто у меня прога какая-то кривая)) И jpg тоже жмутся :lol:


главное чтобы потом расжимались, и в результате получался исходный файл. ;)

Добавлено спустя 17 минут 58 секунд:
oxy писал(а):
И передали мы в функцию УКАЗАТЕЛЬ на функцию-конструктор копирования, а где же ЗНАЧЕНИЕ в стеке???...


а если в чистом С, мы передадим структуру по значению:

struct some_struct
{
...
};

void foo(struct some_struct st);

что там в стеке будет? :-)

Obscury писал(а):
Какая разница каким образом компилятор реализует семантику передачи по значению?


точно, как там будет - детали реализации которые зависят от фантазии разработчиков компилятора и железа (теоритически возможно что в железе и самого понятия стека не будет), главно что для программиста это будет копия объекта.


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Скажите пожалуйста, что это за фигня "число извлечений из стека превышает число занесений"? И почему в цикле не меняется счетчик? Причем цикл элементарный...:insane:
Код:
while((chh=fgetc(fp2))!=EOF)
                  {
                     mas[counter]=fgetc(fp2);
                     counter++;
                  }

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
manya
скорее тогда уж:
Код:
while((chh=fgetc(fp2))!=EOF)
                  {
                     mas[counter++]=chh;
                  }

а еще лучше не сравнивать EOF, а использовать спец. ф-цию feof

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

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. Разница, локальная переменная, или параметр в стеке в том, что порядок переменных в стеке определён, (или переопределён ;) ), а порядок распределения памяти под локальные переменные никто не регламентировал...

З.Ы. Смысл спора в более детальном понимании С++


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
oxy
int

Добавлено спустя 4 минуты 53 секунды:
А-а-а-а-а-а, самое главное-то :oops: Ошибка тУта
Код:
#pragma pack(1)
struct sym
{
   char ch;
   float freq;     
   char code[255];
   sym *left;
   sym *right;
   int len1;
};
#pragma pack(pop)

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
oxy писал(а):
А вот тут и будет вся структура в стеке...


ты хочешь сказать что в С++

заменив

struct some_struct
{
int a;
char b;
};

на

class some_struct
{
public:
int a;
char b;
};

генерируемый машинный код на

some_struct st;
foo(st);

будет отличаться в зависимости от того 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) { }

   A(const A& _a) {
      m_x = _a.m_x;
      m_y = _a.m_y;
      m_z = _a.m_z;
   }

   void Test(int _x) {
      m_x = _x;
   }

private:
   int m_x;
   int m_y;
   int m_z;
};

void Test(A a) { }

int _tmain(int argc, _TCHAR* argv[])
{
   A a(1, 2);
   a.Test(3);
   Test(a);
   return 0;
}

VS2008 по этому коду генерит следующее:
Код:
; A a(1, 2):
00E414FE  push        2   
00E41500  push        1   
00E41502  lea         ecx,[a]
00E41505  call        A::A (0E411C2h)
; a.Test(3):
00E4150A  push        3   
00E4150C  lea         ecx,[a]
00E4150F  call        A::Test (0E4120Dh)
; Test(a):
00E41514  sub         esp,0Ch
00E41517  mov         ecx,esp
00E41519  lea         eax,[a]
00E4151C  push        eax 
00E4151D  call        A::A (0E4118Bh)
00E41522  call        Test (0E411AEh)
00E41527  add         esp,0Ch

На сколько я знаю в стандарте нет регламента на передачу указателя this. VS2008, как видно при дизассемблеровани, передаёт его через регистр ecx, а не через стек. При вызове Test(a) в качестве this выступает значение регистра esp (вершина стека):
Код:
00E41514  sub         esp,0Ch
00E41517  mov         ecx,esp


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
progn писал(а):
будет отличаться в зависимости от того some_struct определена как struct или как class?


Ай-яй-яй...
Речь то, шла о С, а не С++, где struct и class отличаются только некоторыми умолчаниями.


 

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;
}

Код:
; B b(1, 2):
003214FE  push        2   
00321500  push        1   
00321502  lea         ecx,[b]
00321505  call        B::B (321217h)
; Test(b);
0032150A  sub         esp,8
0032150D  mov         ecx,esp
0032150F  lea         eax,[b]
00321512  push        eax 
00321513  call        A::A (32118Bh)
00321518  call        Test (3211AEh)
0032151D  add         esp,8

Вот это всё поясняет
Код:
00321513  call        A::A (32118Bh)
00321518  call        Test (3211AEh)


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Obscury

Да-а. Давно я не писал ассемблерные либы к С++.
Насчёт this - это, я знал.
Если не изменяет память, в АСМе для С++ использовалось Prolog`овское соглашение передачи переменных. Очень многое зависит от уровня оптимизаций (иногда а+в в отладчике узнать не можешь)


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 58 из 87<  1 ... 55  56  57  58  59  60  61 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan