void*
От: Аноним  
Дата: 21.10.04 08:07
Оценка:
Справедливо ли sizeof(void*)==sizeof(T*)
где Т — любой тип
Re: void*
От: elcste  
Дата: 21.10.04 08:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Справедливо ли sizeof(void*)==sizeof(T*)

А>где Т — любой тип

Нет.
Re[2]: void*
От: Аноним  
Дата: 21.10.04 08:29
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>Справедливо ли sizeof(void*)==sizeof(T*)

А>>где Т — любой тип

E>Нет.


спасибо
но хотелось бы немного подробней, почему и в каких случаях
Re: void*
От: korzhik Россия  
Дата: 21.10.04 08:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Справедливо ли sizeof(void*)==sizeof(T*)

А>где Т — любой тип

да
Re[2]: void*
От: korzhik Россия  
Дата: 21.10.04 08:41
Оценка: :))) :))) :))) :))) :))) :))
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


А>>Справедливо ли sizeof(void*)==sizeof(T*)

А>>где Т — любой тип

K>да


то етсь нет, просто когда я писал это сообщение зашёл начальник и спросил хочу ли я повышения зарплаты и я автоматически написал да.
Re[3]: void*
От: Lorenzo_LAMAS  
Дата: 21.10.04 08:45
Оценка: :))
Почему твой ответ тогда не "дадададада, конечно!" ?
Of course, the code must be complete enough to compile and link.
Re[3]: void*
От: elcste  
Дата: 21.10.04 08:47
Оценка: 9 (2)
Здравствуйте, Аноним, Вы писали:

А>>>Справедливо ли sizeof(void*)==sizeof(T*)

А>>>где Т — любой тип

E>>Нет.


А>спасибо

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

Потому что стандарт гарантирует лишь совпадение внутреннего представления указателя на void с внутренним представлением указателя на символьные типы. Относительно других типов такой гарантии не дается.

Представьте себе платформу, в которой минимальной адресуемой единицей памяти является 32-разрядное слово. Адрес также 32-разрядный. Реализация C/C++ для такой платформы может хранить объекты типа char упакованными по четыре в одном слове. Таким образом, char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.
Re[4]: void*
От: korzhik Россия  
Дата: 21.10.04 08:51
Оценка: :)))
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Почему твой ответ тогда не "дадададада, конечно!" ?


а потому что я хладнокровный человек с нордическим характером.
Re[5]: void*
От: Lorenzo_LAMAS  
Дата: 21.10.04 08:54
Оценка: :))) :)))
K>а потому что я хладнокровный человек с нордическим характером.

везет. наверное, начальнику ты ответил "нет", раз в форум написал "да" ?
Of course, the code must be complete enough to compile and link.
Re[4]: void*
От: Аноним  
Дата: 21.10.04 08:54
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>>>Справедливо ли sizeof(void*)==sizeof(T*)

А>>>>где Т — любой тип

E>>>Нет.


А>>спасибо

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

E>Потому что стандарт гарантирует лишь совпадение внутреннего представления указателя на void с внутренним представлением указателя на символьные типы. Относительно других типов такой гарантии не дается.


E>Представьте себе платформу, в которой минимальной адресуемой единицей памяти является 32-разрядное слово. Адрес также 32-разрядный. Реализация C/C++ для такой платформы может хранить объекты типа char упакованными по четыре в одном слове. Таким образом, char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.


спасибо, за подробное обьяснение
Re[6]: void*
От: korzhik Россия  
Дата: 21.10.04 09:14
Оценка: :))
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>везет. наверное, начальнику ты ответил "нет", раз в форум написал "да" ?


ты не поверишь, но по некоторым причинам я ответил нет
Re[4]: void*
От: SWW Россия  
Дата: 21.10.04 10:26
Оценка:
E> <...> char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.

Интересная гипотеза. А на самом деле такие есть?
Re[5]: void*
От: elcste  
Дата: 21.10.04 10:41
Оценка:
Здравствуйте, SWW, Вы писали:

E>> <...> char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.


SWW>Интересная гипотеза. А на самом деле такие есть?


Если мне не изменяет склероз, упакованные символы были на IBM 360/370. Но компиляторов C для них я не встречал. Не знаю, существовали ли такие.
Re[6]: void*
От: Dervish Россия http://www.dervish.ru
Дата: 21.10.04 11:37
Оценка:
Здравствуйте, elcste, Вы писали:

E>Если мне не изменяет склероз, упакованные символы были на IBM 360/370.


Склероз вам изменяет. Архитектура IBM 360/370 (ЕС ЭВМ) прекрасно работали со строками символов. Машина нормально адресовала память побайтно и требования о том, чтобы в строковых операциях указатель ссылался только на границу слова (двойного слова и т.д.) не было. Там не было нулевого байта в конце строки, как правило применялась немного другая технология для обозначения длин строк. Но в остальном это была совершенно нормальная архитектура.

E>Но компиляторов C для них я не встречал. Не знаю, существовали ли такие.


Чаще всего на ЕС ЭВМ работала ОС ЕС. Под ОС ЕС мне не приходилось встречать компиляторов языка С. Возможно он и был, я об этом ничего не знаю.

Была ещё одна операционная система, так называемая Система Виртуальных Машин (СВМ). Так вот, под этой операционкой мне приходилось видеть полноценную реализацию UNIX-а. И, конечно же, там был компилятор с языка С.

Если интересно, могу рассказать подробнее, только это всё уже такие анахронизмы... Носит чисто познавательный интерес.
... << RSDN@Home 1.1.4 beta 3 rev. 194>>
Re[4]: void*
От: Аноним  
Дата: 21.10.04 12:59
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>>>Справедливо ли sizeof(void*)==sizeof(T*)

А>>>>где Т — любой тип

E>>>Нет.


А>>спасибо

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

E>Потому что стандарт гарантирует лишь совпадение внутреннего представления указателя на void с внутренним представлением указателя на символьные типы. Относительно других типов такой гарантии не дается.


E>Представьте себе платформу, в которой минимальной адресуемой единицей памяти является 32-разрядное слово. Адрес также 32-разрядный. Реализация C/C++ для такой платформы может хранить объекты типа char упакованными по четыре в одном слове. Таким образом, char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.


а для Win32 Linux/Unix это справедливое утверждение ?
Re[4]: void*
От: Кодт Россия  
Дата: 21.10.04 13:10
Оценка:
Здравствуйте, elcste, Вы писали:

На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).
Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)
Перекуём баги на фичи!
Re[5]: void*
От: Kluev  
Дата: 21.10.04 13:26
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, elcste, Вы писали:


К>На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).

К>Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)

Более того можно так же не волноватся насчет sizeof(void*), sizeof(T*) и стандарта. Т.к. платформы в которых sizeof(void*) != sizeof(T*) лично мной не поддерживаются . Пусть те извращенцы которые создают такие платформы поищут себе таких же извращенцев программистов.
Re[6]: void*
От: Аноним  
Дата: 21.10.04 14:10
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Здравствуйте, Кодт, Вы писали:


К>>Здравствуйте, elcste, Вы писали:


К>>На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).

К>>Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)

K>Более того можно так же не волноватся насчет sizeof(void*), sizeof(T*) и стандарта. Т.к. платформы в которых sizeof(void*) != sizeof(T*) лично мной не поддерживаются . Пусть те извращенцы которые создают такие платформы поищут себе таких же извращенцев программистов.


ну вот так бы и сразу
а вообще всем спасибо !!!
Re[5]: void*
От: achp  
Дата: 21.10.04 14:19
Оценка:
Здравствуйте, Кодт, Вы писали:

К>На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).

К>Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)

Чуточку надо уточнить.

T* -> void* — преобразовывается без потерь;
void* -> T* — преобразовывается без потерь, но при условии, что void* был получен результатом преобразования T* -> void*.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[6]: void*
От: AndrewJD США  
Дата: 21.10.04 17:48
Оценка:
Здравствуйте, achp, Вы писали:

К>>На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).

К>>Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)

A>Чуточку надо уточнить.


A>T* -> void* — преобразовывается без потерь;

A>void* -> T* — преобразовывается без потерь, но при условии, что void* был получен результатом преобразования T* -> void*.


Даже если T — это класс с множественным виртуальным наследованием?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.