А так нельзя?
...
X x;
X* xptr;
__asm lea eax, dword ptr x;
__asm mov word ptr xptr, eax;
C/C++: Адрес объекта
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AndreyT:
<strong>А так нельзя?
...
X x;
X* xptr;
__asm lea eax, dword ptr x;
__asm mov word ptr xptr, eax;</strong><hr></blockquote>
Угу, особенно на UltraSPARC...
<strong>А так нельзя?
...
X x;
X* xptr;
__asm lea eax, dword ptr x;
__asm mov word ptr xptr, eax;</strong><hr></blockquote>
Угу, особенно на UltraSPARC...
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>#include <iostream>
class X;
inline X* AddressOf (X& x) { return &x; }
inline X* operator& (X& x) { return AddressOf (x); }
class X
{
public:
X* operator & ()
{
return NULL;
}
};
int main (int, char **)
{
X x;
std::cout
<< x.operator & () << ' '
<< : [img:c2f9022727]images/smiles/icon_redface.gif[/img:c2f9022727] perator & (x);
}</pre><hr></blockquote>
class X;
inline X* AddressOf (X& x) { return &x; }
inline X* operator& (X& x) { return AddressOf (x); }
class X
{
public:
X* operator & ()
{
return NULL;
}
};
int main (int, char **)
{
X x;
std::cout
<< x.operator & () << ' '
<< : [img:c2f9022727]images/smiles/icon_redface.gif[/img:c2f9022727] perator & (x);
}</pre><hr></blockquote>
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
C/C++: Адрес объекта
tengiz, ну зачем же так сложно [img:7cb11e7f0c]images/smiles/icon_smile.gif[/img:7cb11e7f0c]
ведь выражение [b:7cb11e7f0c](X*)&reinterpret_cast<int&>(x)[/b:7cb11e7f0c] возвращает физический адрес объекта без вызова перегруженного operator&
И компилируется всего в две ассемблерные инструкции (имеется в виду VC++)
[ 10-01-2002: Message edited by: AndreyT ]</p>
ведь выражение [b:7cb11e7f0c](X*)&reinterpret_cast<int&>(x)[/b:7cb11e7f0c] возвращает физический адрес объекта без вызова перегруженного operator&
И компилируется всего в две ассемблерные инструкции (имеется в виду VC++)
[ 10-01-2002: Message edited by: AndreyT ]</p>
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
C/C++: Адрес объекта
AndreyT, Ваш пример поначалу поверг меня в полное недоумение. Судя по имеющейся у меня в под рукой документации это не должно было работать... но сработало. Во всяком случае с VC7. Единственный найденный мной документ, который явно оговаривает легальность такого преобразования - статься в MSDN: Operation: reinterpret_cast. Но это не часть формальной документации, а техническая статья с разьяснениями.
В итоге, я посмотрел в ANSI C++ стандарте - результат: всё в полном порядке. Это легальная операция, в случае если преобразование соответствующих указателей тоже легальная операция. Так что спасибо, это полезная информация.
В итоге, я посмотрел в ANSI C++ стандарте - результат: всё в полном порядке. Это легальная операция, в случае если преобразование соответствующих указателей тоже легальная операция. Так что спасибо, это полезная информация.
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
C/C++: Адрес объекта
По моему - тоже. Абсолютно легальная операция. Правда, менее портируемая, нежели остальные из семейства *_cast. Так на то и предупреждения об этом везде, включая труды Строуструпа.
Эх, и за что я люблю C и C++...
Ведь сколько они, мерзавцы, мне крови попортили [img:897c7ae1a5]images/smiles/icon_smile.gif[/img:897c7ae1a5]
Эх, и за что я люблю C и C++...
Ведь сколько они, мерзавцы, мне крови попортили [img:897c7ae1a5]images/smiles/icon_smile.gif[/img:897c7ae1a5]
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
C/C++: Адрес объекта
А если вообще, мне интереснее другое: зачем нужно определять адрес объекта, который, по своей внутренней логике, запрещает это делать (перегружая operator& и возвращая ноль).
Хотя это, наверное, уже из другой области. Нетехнический вопрос [img:8f8db4b6fa]images/smiles/icon_smile.gif[/img:8f8db4b6fa]
Хотя это, наверное, уже из другой области. Нетехнический вопрос [img:8f8db4b6fa]images/smiles/icon_smile.gif[/img:8f8db4b6fa]
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
C/C++: Адрес объекта
Да это я в порядке шутки [img:f2872b35d1]images/smiles/icon_smile.gif[/img:f2872b35d1]
А в теминологии C++, в моем представлении, это могло бы выглядеть так:
X x;
X* xptr = (X*)&reinterpret_cast<int&>(x);
IMHO, сгенерированный компилятором код будет выглядеть очень похоже, особенно при оптимизации
А в теминологии C++, в моем представлении, это могло бы выглядеть так:
X x;
X* xptr = (X*)&reinterpret_cast<int&>(x);
IMHO, сгенерированный компилятором код будет выглядеть очень похоже, особенно при оптимизации
-
- Уже с Приветом
- Posts: 1257
- Joined: 03 Oct 2001 09:01
- Location: Valinor->Utumno->Angband
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AndreyT:
<strong>А если вообще, мне интереснее другое: зачем нужно определять адрес объекта, который, по своей внутренней логике, запрещает это делать (перегружая operator& и возвращая ноль).
Хотя это, наверное, уже из другой области. Нетехнический вопрос [img:8847052d73]images/smiles/icon_smile.gif[/img:8847052d73] </strong><hr></blockquote>
Ну, 0 возвращается в задачке, а реально возвращается что-то полезное (поэтому, кстати, нехорошо, что в варианте tengiz'a просто оператором & больше пользоваться нельзя). Например, временный объект может детектить, что кто-то запрашивает его адрес, и возвращать динамический объект. Или если нужно как-то обхитрить уже существующий код (ATL, скажем).
<strong>А если вообще, мне интереснее другое: зачем нужно определять адрес объекта, который, по своей внутренней логике, запрещает это делать (перегружая operator& и возвращая ноль).
Хотя это, наверное, уже из другой области. Нетехнический вопрос [img:8847052d73]images/smiles/icon_smile.gif[/img:8847052d73] </strong><hr></blockquote>
Ну, 0 возвращается в задачке, а реально возвращается что-то полезное (поэтому, кстати, нехорошо, что в варианте tengiz'a просто оператором & больше пользоваться нельзя). Например, временный объект может детектить, что кто-то запрашивает его адрес, и возвращать динамический объект. Или если нужно как-то обхитрить уже существующий код (ATL, скажем).
-
- Уже с Приветом
- Posts: 3640
- Joined: 13 Sep 1999 09:01
- Location: Canada
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Melkor:
<strong>
Ну, 0 возвращается в задачке, а реально возвращается что-то полезное (поэтому, кстати, нехорошо, что в варианте tengiz'a просто оператором & больше пользоваться нельзя). Например, временный объект может детектить, что кто-то запрашивает его адрес, и возвращать динамический объект. Или если нужно как-то обхитрить уже существующий код (ATL, скажем).</strong><hr></blockquote>
Да я понимаю, что в реальной жизни все варианты возможны и, в некоторых пределах, допустимы.
Ноль или не ноль возвращается - это действительно не важно в контексте данной дискусии, важно то, что объект [b:87d6d012fe]не даёт[/b:87d6d012fe] узнать свой реальный адрес. Почему или что он там на самом деле делает и возвращает - дело десятое.
Не обращайте на меня внимания [img:87d6d012fe]images/smiles/icon_smile.gif[/img:87d6d012fe] Просто пытаюсь вслух промоделировать ситуцию и узнать, что и как из этого можно извлечь. [img:87d6d012fe]images/smiles/icon_smile.gif[/img:87d6d012fe]
<strong>
Ну, 0 возвращается в задачке, а реально возвращается что-то полезное (поэтому, кстати, нехорошо, что в варианте tengiz'a просто оператором & больше пользоваться нельзя). Например, временный объект может детектить, что кто-то запрашивает его адрес, и возвращать динамический объект. Или если нужно как-то обхитрить уже существующий код (ATL, скажем).</strong><hr></blockquote>
Да я понимаю, что в реальной жизни все варианты возможны и, в некоторых пределах, допустимы.
Ноль или не ноль возвращается - это действительно не важно в контексте данной дискусии, важно то, что объект [b:87d6d012fe]не даёт[/b:87d6d012fe] узнать свой реальный адрес. Почему или что он там на самом деле делает и возвращает - дело десятое.
Не обращайте на меня внимания [img:87d6d012fe]images/smiles/icon_smile.gif[/img:87d6d012fe] Просто пытаюсь вслух промоделировать ситуцию и узнать, что и как из этого можно извлечь. [img:87d6d012fe]images/smiles/icon_smile.gif[/img:87d6d012fe]
-
- Новичок
- Posts: 56
- Joined: 12 Apr 2001 09:01
- Location: Russia
C/C++: Адрес объекта
IMHO - можно воспользоваться тем, что в C++
возможен любой кастинг ...
int *ptr = &((int)obj);
или что-то типа того - правда я не пробовал
это в реале (давно уже снес все компиляторы)
;-)
возможен любой кастинг ...
int *ptr = &((int)obj);
или что-то типа того - правда я не пробовал
это в реале (давно уже снес все компиляторы)
;-)
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
<strong>IMHO - можно воспользоваться тем, что в C++
возможен любой кастинг ...
int *ptr = &((int)obj);
или что-то типа того - правда я не пробовал
это в реале (давно уже снес все компиляторы)
;-)</strong><hr></blockquote>
Есть ещё такая штука - alignment называется...
[img:231b5a2fec]images/smiles/icon_wink.gif[/img:231b5a2fec]
<strong>IMHO - можно воспользоваться тем, что в C++
возможен любой кастинг ...
int *ptr = &((int)obj);
или что-то типа того - правда я не пробовал
это в реале (давно уже снес все компиляторы)
;-)</strong><hr></blockquote>
Есть ещё такая штука - alignment называется...
[img:231b5a2fec]images/smiles/icon_wink.gif[/img:231b5a2fec]
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
C/C++: Адрес объекта
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Dice:
IMHO - можно воспользоваться тем, что в C++
возможен любой кастинг ...
int *ptr = &((int)obj);...<hr></blockquote>Это неверно, потому что такое преобразование (когда оно вообще возможно) порождает временный объект, оператор взятия адреса для которого неприменим, так как это не l-value.
IMHO - можно воспользоваться тем, что в C++
возможен любой кастинг ...
int *ptr = &((int)obj);...<hr></blockquote>Это неверно, потому что такое преобразование (когда оно вообще возможно) порождает временный объект, оператор взятия адреса для которого неприменим, так как это не l-value.