Здравствуйте, Аноним, Вы писали:
А>>>Справедливо ли sizeof(void*)==sizeof(T*) А>>>где Т — любой тип
E>>Нет.
А>спасибо А>но хотелось бы немного подробней, почему и в каких случаях
Потому что стандарт гарантирует лишь совпадение внутреннего представления указателя на void с внутренним представлением указателя на символьные типы. Относительно других типов такой гарантии не дается.
Представьте себе платформу, в которой минимальной адресуемой единицей памяти является 32-разрядное слово. Адрес также 32-разрядный. Реализация C/C++ для такой платформы может хранить объекты типа char упакованными по четыре в одном слове. Таким образом, char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.
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-разрядного слова.
E> <...> char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.
Здравствуйте, SWW, Вы писали:
E>> <...> char* (и, соответственно, void*) будут представлены двумя словами, одно из которых хранит адрес слова, а другое — номер символа в этом слове. Тогда как для хранения указателя на int достаточно будет одного 32-разрядного слова.
SWW>Интересная гипотеза. А на самом деле такие есть?
Если мне не изменяет склероз, упакованные символы были на IBM 360/370. Но компиляторов C для них я не встречал. Не знаю, существовали ли такие.
Здравствуйте, 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 это справедливое утверждение ?
На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*).
Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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*) лично мной не поддерживаются . Пусть те извращенцы которые создают такие платформы поищут себе таких же извращенцев программистов.
Здравствуйте, Кодт, Вы писали:
К>На самом деле, можно не волноваться за габариты sizeof(void*), sizeof(T*). К>Вне зависимости от внутреннего представления, Стандартом гарантировано, что они конвертируются друг в друга "без потерь". (4.10.2)
Чуточку надо уточнить.
T* -> void* — преобразовывается без потерь;
void* -> T* — преобразовывается без потерь, но при условии, что void* был получен результатом преобразования T* -> void*.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Здравствуйте, 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."