информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsПортрет посетителяАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Final words 01.08.01 04:04  Число просмотров: 847
Автор: + (still can not login) Статус: Незарегистрированный пользователь
<"чистая" ссылка>
If the compiler has an object, it knows the exact type and therefore (in C++) will not use late binding for any function calls — or at least, the compiler doesn’t need to use late binding. For efficiency’s sake, most compilers will perform early binding when they are making a call to a virtual function for an object because they know the exact type. Here’s an example:

#include <iostream>
using namespace std;

class Base {
public:
virtual int f() const { return 1; }
};

class Derived : public Base {
public:
int f() const { return 2; }
};

int main() {
Derived d;
Base* b1 = &d;
Base& b2 = d;
Base b3;
// Late binding for both:
cout << "b1->f() = " << b1->f() << endl;
cout << "b2.f() = " << b2.f() << endl;
// Early binding (probably):
cout << "b3.f() = " << b3.f() << endl;
} ///:~

In b1–>f( ) and b2.f( ) addresses are used, which means the information is incomplete: b1 and b2 can represent the address of a Base or something derived from Base, so the virtual mechanism must be used. When calling b3.f( ) there’s no ambiguity. The compiler knows the exact type and that it’s an object, so it can’t possibly be an object derived from Base — it’s exactly a Base. Thus early binding is probably used. However, if the compiler doesn’t want to work so hard, it can still use late binding and the same behavior will occur.

P.S. tema zakryta.
<programming>
2 Ван Мо (продолжение) 01.08.01 00:53  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
браток,
во-первых оставим старую нитку, уже не прилично

никто не работает с разрушенными объектами. ты можешь мне показать код, где я работал с разрушенным объектом?
если ты имеешь ввиду это :
new (this) Parrent;
то поверь - это не так. это совершенно легальный код. тут я работаю скорее с "куском памяти", чем с объектом. поэтому и приводил пример код :
new (data) Parrent;

прочитай ету ссылку http://www.bugtraq.ru/cgi-bin/forum.cgi?type=sb&b=2&m=13214&id=31&cp=azPOqy9BYBYZc
там XR черным по белому показывает адреса ф-ий. очень внимательно рассмотри со слов -
           "Пропускаю все присвоения и настройки таблиц виртуальных методов"

---
просмотри адреса ф-ий.
ПОЖАЛУЙСТА, видишь я уже прошу -))), просмотри внимательно, очень внимательно. я уверен, ты парень умный, а не тупой, ты обязательно увидешь и поймешь что я имел ввиду.

строка child.PrintMsg() - вызывает не виртуальную ф-ию, тогда как она ЕСТЬ самая настоящая виртуальная, потому как я его так определил !!!! не бывает такого, если я определил int i; он у меня превращается в char i; это уже на колдовство смахивает ;-)))


дальше полезно почитать :
http://www.bugtraq.ru/cgi-bin/forum.cgi?type=sb&b=2&m=13325&id=31&cp=azPOqy9BYBYZc

---
диалог с Gesha-ой

с уважением.

З.Ы. пора закрыть эту тему. она у меня в печенках сидит и думаю у тебя тоже.

дамп XR-a. кликни тут.
2 Ван Мо (продолжение) 01.08.01 01:03  
Автор: Ван Мо Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Прежде чем я буду что-то читать, давай договоримся что мы имеем ввиду.
Под разрушением объекта я имел ввиду явный вызов деструктора. Если ты не считаешь вызов деструктора разрушением объекта, то мы не договоримся. Иначе, ты сам сказал что никто не работает с разрушенными объектами.
2 Ван Мо (продолжение) 02.08.01 01:48  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Прежде чем я буду что-то читать, давай договоримся что мы
> имеем ввиду.
> Под разрушением объекта я имел ввиду явный вызов
> деструктора. Если ты не считаешь вызов деструктора
> разрушением объекта, то мы не договоримся. Иначе, ты сам
> сказал что никто не работает с разрушенными объектами.

вот что я писал:
this->~Child();
new (this) Parrent; // отношение как к куску памяти и ничего более. результат - вновь синициализированный объект в предложенном пространстве.


следующий код показывает работу с разрушенным объектом:
this->~Child();
this->m_SomeMeber; // ОПАСНО !!!!

насчет того что делает деструктор, должен он этого делать или нет просмотри
http://www.bugtraq.ru/cgi-bin/forum.cgi?type=sb&b=2&m=13571&id=31&cp=azPOqy9BYBYZc

---
пример 3)

а еще овъедини этот пример с первоначальным, и в первоначальном сделай такую феню - работа с РАЗРУШЕННЫМ объектом
т.е в классе Child :
public:
    virtual void foo()
    {    printf("Function called successful.\n");}

    void Magic()
    {
        this->~Child(); 

        PrintMsg();
        foo(); // если детруктор ни хрена не изменил, этот код пройдет. так ли это, сам посмотри.

        new (this) Parrent();
    }

---

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

=====
2 XR :
то что обещал уже в Москве. Ждем cb. Кстати, возможно я сам очень скоро появлюсь ;-)

destructor
2 Ван Мо (продолжение) 03.08.01 13:47  
Автор: camel_cop Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> 2 XR :
> то что обещал уже в Москве. Ждем cb. Кстати, возможно я сам
> очень скоро появлюсь ;-)

числа 12 будет cb ;))
Просьба не считать мой ник инструкцией к действию :) 02.08.01 06:34  
Автор: Ван Мо Статус: Незарегистрированный пользователь
<"чистая" ссылка>
kabanchik, мы можем бесконечно раскладывать друг друга по строчкам :) Это не продуктивно.
Просто мы считаем багами совершенно разные вещи. Ты очень хочешь заставить деструктор работать как тебе нравится, а мне представляется багом то что после этого может получится. Если я объявляю переменную как Child, а потом она может стать чем угодно, то зачем я объявил ее именно так и почему я не могу сделать то же самое с простым типом? Вопрос "что остается от объекта после его разрушения" может негативно повлиять на ослабленную психику, и уж тем более опасно размышлять о типе этих самых останков. Еще у нас разные понятия о том что "нельзя". Я, например, объявляю переменную приватной с целью не обращаться к ней напрямую, но могу предположить что некоторые делают с точностью до наоборот и не считают это странным. Определенно имеет смысл обратиться к разработчикам компиляторов с предложением наделять объекты умом и сообразительностью, дабы компенсировать недостатки программистов: пытаешься сконвертировать говно в конфетку, а он тебе шварк по монитору ломом и на родном языке вещает: "теперь мля ты знаешь как разрушаются объекты. спаяешь из этого принтер - проедусь катком по системному блоку".
Вощем никто нам не хочет объяснять что там хотел сделать деструктор ну и хрен с ним.

лав фарева
[C++] Sorry что влез... 01.08.01 10:34  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Ты немножко не прав. Явный вызов деструктора не приводит к освобождению памяти. Но должен "чистить" виртуальные таблици и переменые объекта. Т.е. после явного вызова деструктора МОЖНО обращаться к переменым - это не вызовет сбой по памяти, но значения в них будут неопределеными.
Для системы такой объект будет не разрушеным, для пользователя (програмиста) - "покореженным".
[C++] Уточни пожалуйта 01.08.01 13:20  
Автор: Ван Мо Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Ты немножко не прав. Явный вызов деструктора не приводит к
> освобождению памяти. Но должен "чистить" виртуальные
> таблици и переменые объекта.

Я говорил как раз не про освобождение памяти. ПОЧЕМУ он должен чистить виртуальные таблицы и переменные (!?) объекта. ЗАЧЕМ, ДЛЯ КОГО он должен их чистить или где это написано?

> Т.е. после явного вызова
> деструктора МОЖНО обращаться к переменым - это не вызовет
> сбой по памяти, но значения в них будут неопределеными.

- Почему мой компилятор неправильно делит на ноль?
- Ну типа... делить на ноль нельзя...
- Это у вас нельзя а у нас есть __try-__except ппашел к рихтеру казел
- Ну ээээ... А что у вас в результате?
- Баги :(((

> Для системы такой объект будет не разрушеным, для
> пользователя (програмиста) - "покореженным".


Разрушение объекта - это не (или не только) очищение чего-либо. Деструктор формально делает объект негодным к дальнейшему использованию, а реально он имеет право не делать вообще ничего (что собственно и делает), или забить объект, в т.ч. и указатели, равномерно распределенной случайной величиной (это ты имел ввиду под неопределенностью?)
[C++] Уточняю 01.08.01 15:31  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> Я говорил как раз не про освобождение памяти. ПОЧЕМУ он
> должен чистить виртуальные таблицы и переменные (!?)
> объекта. ЗАЧЕМ, ДЛЯ КОГО он должен их чистить или где это
> написано?

Чесно ? Не знаю где это написано. И сам не любитель лезть в рантйам. Но если ты туда все же влезешь,то найдешь много интересного, что компилятор запихнул в твой деструктор.

> Разрушение объекта - это не (или не только) очищение
> чего-либо. Деструктор формально делает объект негодным к
> дальнейшему использованию, а реально он имеет право не
> делать вообще ничего (что собственно и делает), или забить
> объект, в т.ч. и указатели, равномерно распределенной
> случайной величиной (это ты имел ввиду под
> неопределенностью?)

Угу. Не извесно что там будет. Но пользоваться им можно, если сного проинициализировать (НЕ СОЗДАТЬ!)

Ну ладно, как я понял это совсем не относиться к первоночальной теме.
Народ, присоединяйтесь. Нам тут скучно вдвоем. 01.08.01 01:35  
Автор: Ван Мо Статус: Незарегистрированный пользователь
<"чистая" ссылка>
kabanchik wrote:
#include <stdio.h>
#include <new.h>

class Parent
{
public:
    Parent() { ;}
    virtual ~Parent() { ;}
public:
    virtual void PrintMsg() { printf("This function called from class Parent.\n"); }
};
 
class Child: public Parent
{
public:
    Child() { ;}
    virtual ~Child() { ;}
public:
    virtual void PrintMsg() {	printf("This function called from class Child.\n"); }
    void Magic()
    {
        // важная строка !!!! разрушаем "старую" virtual table
        this->~Child();
        // создаем "новый" РОДИТЕЛЬСКИЙ virtual table 
        new (this) Parent;
        printf("Leave Magic.\n");
    }
};

int main()
{
    Child child;
    Child* pChild = &child;
    Child& rChild = child;
 
    child.PrintMsg();
    pChild->PrintMsg();
    rChild.PrintMsg();
  
    printf("\n");
    child.Magic();
    printf("\n");

    child.PrintMsg();
    pChild->PrintMsg();
    rChild.PrintMsg();
 
    return 0;
}

В результате имеем 
This function called from class Child. 
This function called from class Child. 
This function called from class Child. 

Leave Magic. 

This function called from class Child. 
This function called from class Parent. 
This function called from class Parent. 

---

в дополнение - конструктор кроме всего прочего еще и создает таблицу виртуальных ф-ий, который потом разрушается деструктором. вот я и разрушил таблицу, а потом создал, но РОДИТЕЛЬСКИЙ. по результатам следует, что компилятор халтурит - ни хрена не разрушает и не создает. какой-то непонятный блеф разработчиков компилятора.
причем это проявляется во всех компиляторах - ощущуение, что они воровали друг у друга исходники или писал один и тот же "Страуструп" :-)))
[C++] Final words 01.08.01 04:04  
Автор: + (still can not login) Статус: Незарегистрированный пользователь
<"чистая" ссылка>
If the compiler has an object, it knows the exact type and therefore (in C++) will not use late binding for any function calls — or at least, the compiler doesn’t need to use late binding. For efficiency’s sake, most compilers will perform early binding when they are making a call to a virtual function for an object because they know the exact type. Here’s an example:

#include <iostream>
using namespace std;

class Base {
public:
virtual int f() const { return 1; }
};

class Derived : public Base {
public:
int f() const { return 2; }
};

int main() {
Derived d;
Base* b1 = &d;
Base& b2 = d;
Base b3;
// Late binding for both:
cout << "b1->f() = " << b1->f() << endl;
cout << "b2.f() = " << b2.f() << endl;
// Early binding (probably):
cout << "b3.f() = " << b3.f() << endl;
} ///:~

In b1–>f( ) and b2.f( ) addresses are used, which means the information is incomplete: b1 and b2 can represent the address of a Base or something derived from Base, so the virtual mechanism must be used. When calling b3.f( ) there’s no ambiguity. The compiler knows the exact type and that it’s an object, so it can’t possibly be an object derived from Base — it’s exactly a Base. Thus early binding is probably used. However, if the compiler doesn’t want to work so hard, it can still use late binding and the same behavior will occur.

P.S. tema zakryta.
[C++] Final words 02.08.01 01:25  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
let's do another exersise :

> #include <iostream>
> using namespace std;
> 
> class Base {
> public:
>   virtual int f() const { return 1; }
> };
> 
> class Derived : public Base {
> public:
>   int f() const { return 2; }
     void foo()
     {
          this->~Derived();
          new (this)Base;
          f(); // is here late or early binding ???
          // according your words, here must by early binding. right? look at the results
     }
> };
> 
> int main() {
>   Derived d;
>   Base* b1 = &d;
>   Base& b2 = d;
>   Base b3;
>   // Late binding for both:
>   cout << "b1->f() = " << b1->f()
> << endl;
>   cout << "b2.f() = " << b2.f() << endl;
>   // Early binding (probably):
^^^^^^^^^^^^^ good words. you can only suppose, but I gues you are not sure.
>   cout << "b3.f() = " << b3.f() << endl;
> } ///:~ 

---

> In b1–>f( ) and b2.f( ) addresses are used, which means
> the information is incomplete: b1 and b2 can represent the
> address of a Base or something derived from Base, so the
> virtual mechanism must be used. When calling b3.f( )
> there’s no ambiguity. The compiler knows the exact type and
> that it’s an object, so it can’t possibly be an object
> derived from Base — it’s exactly a Base. Thus early binding
> is probably used. However, if the compiler doesn’t want to
> work so hard, it can still use late binding and the same
> behavior will occur.
Very logic, but not completed. as i said we can only suppose. looking at the results you are right, but the question was is it correct ?

>
> P.S. tema zakryta.
З.Ы. давно пора.
[C++] apocalypse 02.08.01 04:01  
Автор: + . Статус: Незарегистрированный пользователь
<"чистая" ссылка>
If your “C++” experience is the same as your English experience then I don’t have to argue with you. You will understand it later (in 1~2 years). :-) :-) :-) :-)
> let's do another exersise :
>
>
> > #include <iostream>
> > using namespace std;
> > 
> > class Base {
> > public:
> >   virtual int f() const { return 1; }
> > };
> > 
> > class Derived : public Base {
> > public:
> >   int f() const { return 2; }
>      void foo()
>      {
> 	  this->~Derived();
> 	  new (this)Base;
> 	  f(); // is here late or early binding ???
> 	  // according your words, here must by early
> binding. right? look at the results
Read my first post again and read this:
foo()
{
	f();
//is equal to
	this->f();//address is used, which
//means  the information is incomplete. Now you see it. Late binding.
//if you don’t believe me look at this assembler code generated by VC compiler.

62:           this->f();
00401589   mov         eax,dword ptr [ebp-4]
0040158C   mov         edx,dword ptr [eax]
0040158E   mov         esi,esp
00401590   mov         ecx,dword ptr [ebp-4]
00401593   call        dword ptr [edx+4]
00401596   cmp         esi,esp
00401598   call        __chkesp (00401c50)
63:           f();
0040159D   mov         eax,dword ptr [ebp-4]
004015A0   mov         edx,dword ptr [eax]
004015A2   mov         esi,esp
004015A4   mov         ecx,dword ptr [ebp-4]
004015A7   call        dword ptr [edx+4]
004015AA   cmp         esi,esp
004015AC   call        __chkesp (00401c50)

}
>      }
> > };
> > 
> > int main() {
> >   Derived d;
> >   Base* b1 = &d;
> >   Base& b2 = d;
> >   Base b3;
> >   // Late binding for both:
> >   cout << "b1->f() = " << b1->f()
> > << endl;
> >   cout << "b2.f() = " << b2.f() <<
> endl;
> >   // Early binding (probably):
> ^^^^^^^^^^^^^ good words. you can only suppose, but I gues
> you are not sure.
Yes, I am not sure. But many compilers were constructed to do “early binding” there.
> >   cout << "b3.f() = " << b3.f() <<
> endl;
> > } ///:~ 
> 

---
>
> > In b1–>f( ) and b2.f( ) addresses are used, which
> means
> > the information is incomplete: b1 and b2 can represent
> the
> > address of a Base or something derived from Base, so
> the
> > virtual mechanism must be used. When calling b3.f( )
> > there’s no ambiguity. The compiler knows the exact
> type and
> > that it’s an object, so it can’t possibly be an object
> > derived from Base — it’s exactly a Base. Thus early
> binding
> > is probably used. However, if the compiler doesn’t
> want to
> > work so hard, it can still use late binding and the
> same
> > behavior will occur.
> Very logic, but not completed. as i said we can only
> suppose. looking at the results you are right, but the
> question was is it correct ?
It is not correct. It is just an optimization, because nobody tries to “TPAX” an object such way as you do.
>
> >
> > P.S. tema zakryta.
> З.Ы. давно пора.
Chto takoe "З.Ы." ? :-}
[C++] apocalypse 03.08.01 01:32  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> If your “C++” experience is the same as your English
> experience then I don’t have to argue with you. You will
> understand it later (in 1~2 years). :-) :-) :-) :-)
you kick donkey's balls
Look, sucker, what about my English somehow you are right. More over, I speak in 3 languages and my grammar was alwait bad. You are stupid twice if you notices it just now ;-))))
What about C++, even you are laughing.

> > let's do another exersise :
> >
> >
> > > #include <iostream>
> > > using namespace std;
> > > 
> > > class Base {
> > > public:
> > >   virtual int f() const { return 1; }
> > > };
> > > 
> > > class Derived : public Base {
> > > public:
> > >   int f() const { return 2; }
> >	  void foo()
> >	  {
> >	  this->~Derived();
> >	  new (this)Base;
> >	  f(); // is here late or early binding ???
> >	  // according your words, here must by early
> > binding. right? look at the results
> Read my first post again and read this:
> foo()
> {
> 	f();
> //is equal to
> 	this->f();//address is used, which
> //means  the information is incomplete. Now you see it.
> Late binding.
> //if you don’t believe me look at this assembler code
> generated by VC compiler.
> 
> 62:	      this->f();
> 00401589   mov	       eax,dword ptr [ebp-4]
> 0040158C   mov	       edx,dword ptr [eax]
> 0040158E   mov	       esi,esp
> 00401590   mov	       ecx,dword ptr [ebp-4]
> 00401593   call        dword ptr [edx+4]
> 00401596   cmp	       esi,esp
> 00401598   call        __chkesp (00401c50)
> 63:	      f();
> 0040159D   mov	       eax,dword ptr [ebp-4]
> 004015A0   mov	       edx,dword ptr [eax]
> 004015A2   mov	       esi,esp
> 004015A4   mov	       ecx,dword ptr [ebp-4]
> 004015A7   call        dword ptr [edx+4]
> 004015AA   cmp	       esi,esp
> 004015AC   call        __chkesp (00401c50)

right !!! I meant exactly this. in this case it is always called via vtbl. here are your words :
The compiler knows the exact type and that it’s an object, so it can’t possibly be an object derived from Base — it’s exactly a Base. Thus early binding is probably used.
class A
{
    void foo()
    {
        ; // Do I know who am I ???
    }
};

---

>
> }
> > }
> > > };
> > >
> > > int main() {
> > > Derived d;
> > > Base* b1 = &d;
> > > Base& b2 = d;
> > > Base b3;
> > > // Late binding for both:
> > > cout << "b1->f() = " <<
> b1->f()
> > > << endl;
> > > cout << "b2.f() = " << b2.f()
> <<
> > endl;
> > > // Early binding (probably):
> > ^^^^^^^^^^^^^ good words. you can only suppose, but I
> gues
> > you are not sure.
> Yes, I am not sure. But many compilers were constructed to
> do “early binding” there.
> > > cout << "b3.f() = " << b3.f()
> <<
> > endl;
> > > } ///:~
> >

---

> >
> > > In b1–>f( ) and b2.f( ) addresses are used,
> which
> > means
> > > the information is incomplete: b1 and b2 can
> represent
> > the
> > > address of a Base or something derived from Base,
> so
> > the
> > > virtual mechanism must be used. When calling
> b3.f( )
> > > there’s no ambiguity. The compiler knows the
> exact
> > type and
> > > that it’s an object, so it can’t possibly be an
> object
> > > derived from Base — it’s exactly a Base. Thus
> early
> > binding
> > > is probably used. However, if the compiler
> doesn’t
> > want to
> > > work so hard, it can still use late binding and
> the
> > same
> > > behavior will occur.
> > Very logic, but not completed. as i said we can only
> > suppose. looking at the results you are right, but the
> > question was is it correct ?
> It is not correct. It is just an optimization, because
> nobody tries to “TPAX” an object such way as you do.
look, it is ever possible to avoid bug. We do not discuss about sexual orientations. The code which I wrote is correct.
in VC++ try this
#inclide <windows.h>
class Ellipse
{
public:
    void foo()
    {}
};

int main()
{
    Ellipse* p = new Ellipse;
    p->foo();
    return 0;
}

---
is anything incorrect? But try to compile this. Is it bug?
but of course we can avoid this, just declare Ellipse as XEllipse. So, should we pay attention on it or keep silence?

> >
> > >
> > > P.S. tema zakryta.
> > З.Ы. давно пора.
> Chto takoe "З.Ы." ? :-}
З.Ы. => very terrible words

Армянскому радио спрашивают - можно ли трахаться на Красной площади.
ответ - можно, но не советуем. Будут слишком много советчиков.

мораль - то что происходит в коде даже моя бабушка со зрением -10 увидеть сможет. вопрос стоит является это багом или так и должно быть. совет - не ленись, почитай все мессаги. понимаю что связь плохая. попроси у XR-a может он разрешит попользоваться его прокси.

могу себе позволить подумать, что у тебя хреновый опыт работы с узерами. т.к. узер очень хитрыми комбинациями действий крашнет твою прогу. да еще так, что ты никогда не догодаешься как такое возможно. так что же из этого? показать узеру красную карточку и удалить из поля словами - нехер было изнываться над программой.

regards
[C++] apocalypse 03.08.01 05:08  
Автор: + . Статус: Незарегистрированный пользователь
<"чистая" ссылка>
O-O-o, ne kipishi!
. . .
> right !!! I meant exactly this. in this case it is always
> called via vtbl. here are your words :
> The compiler knows the exact type and that it’s an object,
> so it can’t possibly be an object derived from Base — it’s
> exactly a Base. Thus early binding is probably used.
>
> class A
> {
>     void foo()
>     {
> 	; // Do I know who am I ???
>     }
> };
B:
Kak obect znaet o member funkcii?
O:
obect hranit pointer na etu foo.
B:
Kak funkcia znaet kto ee "hoziain"?
O:
Foo imeet implicit argument kotoryi postavliaet "this" pointer.

Teper` kogda ty ( ili I ) vyzyvaesh(u) drugui non static foo etogo obecta, chto proishodit? To chto my i videli v tom primere (f(); this->f()).
. . . 

> > It is not correct. It is just an optimization, because
> > nobody tries to “TPAX” an object such way as you do.
> look, it is ever possible to avoid bug. We do not discuss
> about sexual orientations. The code which I wrote is
> correct.

No doubt. 

> in VC++ try this
> 
> #inclide <windows.h>
> class Ellipse
> {
> public:
>     void foo()
>     {}
> };
> 
> int main()
> {
>     Ellipse* p = new Ellipse;
>     p->foo();
>     return 0;
> }
> 

---
> is anything incorrect? But try to compile this. Is it bug?
> but of course we can avoid this, just declare Ellipse as
> XEllipse. So, should we pay attention on it or keep
> silence?

Yep, compiler must give us a warning about redefinition.

>
> > >
> > > >
> > > > P.S. tema zakryta.
> > > З.Ы. давно пора.
> > Chto takoe "З.Ы." ? :-}
> З.Ы. => very terrible words
>
> Армянскому радио спрашивают - можно ли трахаться на Красной
> площади.
> ответ - можно, но не советуем. Будут слишком много
> советчиков.
>
> мораль - то что происходит в коде даже моя бабушка со
> зрением -10 увидеть сможет. вопрос стоит является это багом
> или так и должно быть. совет - не ленись, почитай все

Po moemu BUG eto ne namerennoe upuchenie v programme resultat kotorogo nepravilnaia rabota etoi programmy. To chot bylo zalozheno v kompiler ne Iavlialos` bugom, eto bylo sdelano s celu optimizacii koda. S teoreticheskoi tochki zrenia eto ne pravilno, no my zivem v realnom mire i ochen chasto delaem uprocheniia (okruglenie, zamenu, i.t.d ).Chto i bylo sdelanno.

> мессаги. понимаю что связь плохая. попроси у XR-a может он
> разрешит попользоваться его прокси.

Ne zhelannyi I gost`. (dazhe dl ne mozhet(ne hochet, net vremeni . . .) login otremontirovat`)

>
> могу себе позволить подумать, что у тебя хреновый опыт
> работы с узерами. т.к. узер очень хитрыми комбинациями

Dumai chto hochesh.

> действий крашнет твою прогу. да еще так, что ты никогда не
> догодаешься как такое возможно. так что же из этого?

Chto I tupee usera chto li? A Krashanut` mozhno tolko tu progu v kotoroi eto zalozheno. Estestvenno chem slozhnee proga, tem bolshe veroiatnost` etogo. I ni kto ot etogo ne zastrahovan. Dlia etogo QA dengi poluchaet, chto by vse eto vylovit`. I kstati lublu kogda izmyvautsia nad moei programmoi, sam lubli nad nei ismyvatsia (chto mazohistkoe v etom est`, uff).

> показать узеру красную карточку и удалить из поля словами -
> нехер было изнываться над программой.
>
> regards
take care . . .
[C++] apocalypse 04.08.01 00:48  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > in VC++ try this
> >
> > #inclide <windows.h>
> > class Ellipse
> > {
> > public:
> >	 void foo()
> >	 {}
> > };
> > 
> > int main()
> > {
> >	 Ellipse* p = new Ellipse;
> >	 p->foo();
> >	 return 0;
> > }
> > 

---
> > is anything incorrect? But try to compile this. Is it
> bug?
> > but of course we can avoid this, just declare Ellipse
> as
> > XEllipse. So, should we pay attention on it or keep
> > silence?
>
> Yep, compiler must give us a warning about redefinition.
это не редефенишн. это компайлер так ругается. дефенишн начинается с места => class Ellipse
мое мнение- компайлер должен быть на столько умет, чтобы отличить вызов ф-ии от класса.
кстати компайлер ругается и на это :
int main()
{
Ellipse el;
}

> > > > > P.S. tema zakryta.
> > > > З.Ы. давно пора.
> > > Chto takoe "З.Ы." ? :-}
> > З.Ы. => very terrible words
а З.Ы. - на русском keyboard locale layout совпадает с P.S. ;-)

> Po moemu BUG eto ne namerennoe upuchenie v programme
> resultat kotorogo nepravilnaia rabota etoi programmy. To
> chot bylo zalozheno v kompiler ne Iavlialos` bugom, eto
> bylo sdelano s celu optimizacii koda. S teoreticheskoi
> tochki zrenia eto ne pravilno, no my zivem v realnom mire i
> ochen chasto delaem uprocheniia (okruglenie, zamenu, i.t.d
> ).Chto i bylo sdelanno.
согласен. но упрощения иногда имеют нежеланные последствия. пример тому ссылка XR-a на Java. я не пробовал, но верю ему на слово ;-)

> > мессаги. понимаю что связь плохая. попроси у XR-a
> может он
> > разрешит попользоваться его прокси.
>
> Ne zhelannyi I gost`. (dazhe dl ne mozhet(ne hochet, net
> vremeni . . .) login otremontirovat`)
;-)))) что то пессимистические у тебя пошли настрои ;-)))
что то на тебя это не похоже.
а у dl-a тормозит из за хостера. я сам через прокси XR-a лезу. так что сколько бы он не желал и не ремонтировал, все равно хостер свое гадкое дело сделает.

> > действий крашнет твою прогу. да еще так, что ты
> никогда не
> > догодаешься как такое возможно. так что же из этого?
>
> Chto I tupee usera chto li? A Krashanut` mozhno tolko tu
> progu v kotoroi eto zalozheno. Estestvenno chem slozhnee
> proga, tem bolshe veroiatnost` etogo. I ni kto ot etogo ne
> zastrahovan. Dlia etogo QA dengi poluchaet, chto by vse eto
> vylovit`. I kstati lublu kogda izmyvautsia nad moei
> programmoi, sam lubli nad nei ismyvatsia (chto mazohistkoe
> v etom est`, uff).

действительно мазохист -)

>
> > показать узеру красную карточку и удалить из поля
> словами -
> > нехер было изнываться над программой.
> >
> > regards
> take care . . .
good luck.
Ooooooooooooooo 03.08.01 12:45  
Автор: One More Статус: Незарегистрированный пользователь
<"чистая" ссылка>
>> The code which I wrote is
> > correct.
>
> No doubt.
>
> > in VC++ try this
> >
> > #inclide <windows.h>
> > class Ellipse
> > {
> > public:
> >	 void foo()
> >	 {}
> > };
> > 
> > int main()
> > {
> >	 Ellipse* p = new Ellipse;
> >	 p->foo();
> >	 return 0;
> > }
> > 

---
> > is anything incorrect? But try to compile this. Is it
> bug?
> > but of course we can avoid this, just declare Ellipse
> as
> > XEllipse. So, should we pay attention on it or keep
> > silence?
>
> Yep, compiler must give us a warning about redefinition.

r u sure that was a kind of redefinition? ;)
THIS IS REDEFINITION DUDE: new (this) Parent;
MUST COMPILER GIVE US SOMETHING???
[C++] we should pay attantion to it 03.08.01 04:40  
Автор: One More Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> [censored]

> The code which I wrote is correct.
> in VC++ try this
bool  Ellipse(int, int, int, int, int);
class Ellipse {};

void main()
{
  Ellipse *p;
}

---
> is anything incorrect? But try to compile this. Is it bug?
> but of course we can avoid this, just declare Ellipse as
> XEllipse. So, should we pay attention on it or keep
> silence?
subj. looks like function overloaded with class...[censored]... compiler error. what color the bug was? how often?

> [censored]
[C++] apocalypse 02.08.01 08:42  
Автор: irka Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> If your “C++” experience is the same as your English
> experience then I don’t have to argue with you. You will
> understand it later (in 1~2 years). :-) :-) :-) :-)

Ой, ой, ой. Пальцы прямо из экрана лезут...


> foo()
> {
> f();
> //is equal to
> this->f();//address is used, which
> //means the information is incomplete. Now you see it.
> Late binding.
> //if you don’t believe me look at this assembler code
> generated by VC compiler.
>
> 62: this->f();
> 00401589 mov eax,dword ptr [ebp-4]
> 0040158C mov edx,dword ptr [eax]
> 0040158E mov esi,esp
> 00401590 mov ecx,dword ptr [ebp-4]
> 00401593 call dword ptr [edx+4]
> 00401596 cmp esi,esp
> 00401598 call __chkesp (00401c50)
> 63: f();
> 0040159D mov eax,dword ptr [ebp-4]
> 004015A0 mov edx,dword ptr [eax]
> 004015A2 mov esi,esp
> 004015A4 mov ecx,dword ptr [ebp-4]
> 004015A7 call dword ptr [edx+4]
> 004015AA cmp esi,esp
> 004015AC call __chkesp (00401c50)

А к чему ты это нарисовал? kabanchik(а) неустраивало как раз раннее связывание в обход vtbl в случае вызова d.f() для этого примера. Ты бы предыдущие постинги почитал бы или гордыня не позволяет?

> > > // Early binding (probably):
> > ^^^^^^^^^^^^^ good words. you can only suppose, but I
> gues
> > you are not sure.
> Yes, I am not sure. But many compilers were constructed to
> do “early binding” there.

Ой я сейчас умру. Я все думала кто-же такой под плюсиками скрывается, а это оказывается Bruce Eckel собственной персоной. Интересно, а собственный пример ты можешь изобразить или только из книжки copy/paste?


> Chto takoe "З.Ы." ? :-}
Ты бы это... русский шрифт бы себе поставил что-ли. Который год все на велапуке общаешься, глядишь и узнал бы что такое "З.Ы.".

2kabanchik: В общем в таком поведении компиляторов нет ничего странного, как бы по умолчанию компилятор должен использовать раннее связывание там где это возможно. И в случае с явным указанием класса, функцию которого следует вызвать, компилятор и должен вызвать функцию "напрямую" без обращения к таблице. Фокусы с заменой vtbl "запрограммированы" не были ;))))
[C++] apocalypse 03.08.01 22:10  
Автор: + . Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > If your “C++” experience is the same as your English
> > experience then I don’t have to argue with you. You
> will
> > understand it later (in 1~2 years). :-) :-) :-)
> :-)
>
> Ой, ой, ой. Пальцы прямо из экрана лезут...

Dak slomai ix.

>
>
> > foo()
> > {
> > f();
> > //is equal to
> > this->f();//address is used, which
> > //means the information is incomplete. Now you see
> it.
> > Late binding.
> > //if you don’t believe me look at this assembler code
> > generated by VC compiler.
> >
> > 62: this->f();
> > 00401589 mov eax,dword ptr [ebp-4]
> > 0040158C mov edx,dword ptr [eax]
> > 0040158E mov esi,esp
> > 00401590 mov ecx,dword ptr [ebp-4]
> > 00401593 call dword ptr [edx+4]
> > 00401596 cmp esi,esp
> > 00401598 call __chkesp (00401c50)
> > 63: f();
> > 0040159D mov eax,dword ptr [ebp-4]
> > 004015A0 mov edx,dword ptr [eax]
> > 004015A2 mov esi,esp
> > 004015A4 mov ecx,dword ptr [ebp-4]
> > 004015A7 call dword ptr [edx+4]
> > 004015AA cmp esi,esp
> > 004015AC call __chkesp (00401c50)
>
> А к чему ты это нарисовал? kabanchik(а) неустраивало как
> раз раннее связывание в обход vtbl в случае вызова d.f()
> для этого примера. Ты бы предыдущие постинги почитал бы или
> гордыня не позволяет?

Po moemu I otvetil na ego vopros. Sluchaii kogda Foo vyzyvaetsia vnutri drugoi foo obecta.
Tak chto eto eche ras dokazyvaet, chto terpenia u tebia net prochitat` posting, na kotoryi I otvetil. I uvidev moi moniker na gorizonte stremishsia ko mne kak bыdlo bezhalo na zimnii dvorec.

>
> > > > // Early binding (probably):
> > > ^^^^^^^^^^^^^ good words. you can only suppose,
> but I
> > gues
> > > you are not sure.
> > Yes, I am not sure. But many compilers were
> constructed to
> > do “early binding” there.
>
> Ой я сейчас умру. Я все думала кто-же такой под плюсиками
> скрывается, а это оказывается Bruce Eckel собственной
> персоной. Интересно, а собственный пример ты можешь
> изобразить или только из книжки copy/paste?

Bot vidish i ty chitala eto knigu. Interesno, A vse ostalnye znania tebe ot boga dany?

>
>
> > Chto takoe "З.Ы." ? :-}
> Ты бы это... русский шрифт бы себе поставил что-ли. Который
> год все на велапуке общаешься, глядишь и узнал бы что такое
> "З.Ы.".

Ne vizhu ni kakoi sviazi mezdu ustanovlennym shriftom i "З.Ы.".

>
> 2kabanchik: В общем в таком поведении компиляторов нет
> ничего странного, как бы по умолчанию компилятор должен
> использовать раннее связывание там где это возможно. И в
> случае с явным указанием класса, функцию которого следует
> вызвать, компилятор и должен вызвать функцию "напрямую" без
> обращения к таблице. Фокусы с заменой vtbl
> "запрограммированы" не были ;))))
[C++] apocalypse 03.08.01 01:41  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Ой я сейчас умру. Я все думала кто-же такой под плюсиками
> скрывается, а это оказывается Bruce Eckel собственной
у него и знакомства с дамами есть ???
это большой успех
> персоной. Интересно, а собственный пример ты можешь
> изобразить или только из книжки copy/paste?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - у него с пальцами лучше получается.
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach