![]() |
Модераторы: bsa Страницы: (9) Все « Первая ... 2 3 [4] 5 6 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]() ![]() ![]() |
|
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
здесь речь идет не о размере, а о выравнивании. И о том, что второе совсем не обязательно равно первому. Например классическая х86 система не требует выравнивания (т.е. align должен быть на 1), хотя и приветствует ![]() |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Это вы сами с собой дискусируете?! Я нигде не гворил, что указатель должен быть выравнен на границу слова! Я приводил пример, ято если указатель является производным от типа int, то он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову! |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. То есть чтобы было понятно, на 32 -битовой платформе Intel тип int может равняться 16 битам. Но это соответсвует размеру регистра AX, то есть значению слова на той платформе (в данном случа 16-битовой), для совместимостью с которой создается компилятор. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны.. ![]() |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
xvr |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
[QUOTE=Сыроежка,3.7.2011, 18:20]
Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds ![]() ![]() al.s
![]() |
||||||||||
|
|||||||||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Там все ясно было написано, что значение указателя на тип int дожно быть выравнено на границу слова в соответствии с выравниванием типа int. . |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
У меня такое впечатление, что я имею дело не с адекватным человеком! Я говорил, что значение указателя должны быть выравнено согласно выравниванию типа данных, на которое он указывает. Я несколько раз специально для вас это повторял и в качестве примера приводил указатель на тип int. Во-вторых, совершенно не понятно, какие "определения основных терминово" вам нужны? Любое цитирование стандарта предполагает ссылки на термины стандарта. Так что цитировать стандарт - это всегда корректно. В-третьих, стандарт С++ также требует выравнивание значений указателей в соответствии с выравниванием типов, на которые эти указатели указывают. Джае оставляя в стороне стандарты, а просто руководствуясь обычным здравым смыслом, очевидно, что в С и в С++ должно быть одно и то же выравнивание, так как модули на С и С++ очнь часто собираются в один проект. В противном случае любой проект, состоящий из смешанных модулей, был бы некорректным! |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Сыроежка |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Вы очевидно относиетсь к тем программистам, опыт которых ограничен лишь работой на одной платформе, и которые начинают свято верить, что других аппаратных архитектур и операционных систем в природе просто не существует! ![]() Я вам на самом деле уже все указал, просто вы не внимательно читаете, что вам другие пишут! Есть такие вычислительные машины, как IBM mainframe. В настоящее время это серия Z, а операционная система соответственно называется z/OS. Так на этой платформе обращение к памяти, не выравненное соответсвующим образом приводит к аварийному завершению программы. Например, если вы в ассемблере для IBM, который называется HLASM ( от слов High Level Assembler ), зададите директиву
то память будет выравнена на границу слова. Если у вас есть знакомые, которые имеют дело с IBM mainframe, то вы можете у них проконсультироваться. У меня есть документация по IBM mainframe, включая "Руководство по операциям", а также руководства по ассемблеру HLASM, которая лежит где-то упакованная. Как я найду ее, то сомгу вам привести непосредственно выдержки из документации. А пока ограничусь цитатой из старой книги автора У.Радд "Программирование на языке ассемблера на вычислительной системе IBM 360 и 370": "Это предложение (смотри выше -мое прим.) запрашивает резервирование трех полных слов ( 3F) и присваивает имени WORDS адрес первого из зарезервированных 12 байтов. Поскольку выделение памяти мы запросили полными словами будет произведено выравнивание по границе полного слова, т.е. в качестве адреса WORDS будет выбрано значение кратное 4." (стр. 135). Когда на С или С++ объявляется статическая переменная типа int, то как раз генерируется директива ассемблера DS F. То есть на всех компиляторах, а не только IBM mainframe, для целых чисел выбирается размер машинного слова, соответсвующий размеру регистра. Почему это сделано? Да потому что арифметическим операциям поставлены в соответсвии машинные команды для выполнения арифметических операций над регистрами. Если бы не было такого соответсвия, то пришлось бы с помощью других команд моделироваться эти простейшие арифметические операции, что сразу же делало С и С++ неэффективными языками. Когда вы сами удостоверитесь в том, что я написал, с помощью своих более опытных щнакомых, или справитесь по этому вопросу в интернет, то попробуйте поставить себя на место разработчиков стандарта языков С и С++. Правильный код, написанный на С/С++, должен быть переносим, не так ли? То есть поведение программы должно быть определенным. Теперь представьте ситуацию, что ваш "правильный" код на одной платформе работает, а на другой платформе аварийно завершается. И что тогда делать с переносимостью языка?! Она рассыпается как карточный домик! Значит надо принимать такое решение в стандарте, чтобы исключить такую ситуцию, чтобы действительно правильный окд, который удовлетворяет стандарту, мог работать на любой платформе! Я вам приведу другой пример узости мышление подобного вашему. Он симметричен данной дискуссии, но только тогда оппонентом у меня выступал программист, работающий на IBM mainframe. ОН в стандартную строковую функцию передавал нулевой указатель. Когда я ему заявил, что так делать нельзя, и такое поведение программы неопределенное, он мне в ответ точно стал возражать походим образом, как это делаете вы. Он мне заявил, что программа нормально работает, так как IBM mainframe позволяет читать память по нулевым адресам. Убедить его было бесполезно, пока я его не подвел к Intel платформе, на которой вы работаете, и не показал, что программа завершается аварийно при попытке чтения в Windows памяти по нулевым адресам. Так что смотрите на вещи ширше! ![]() ![]() Добавлено через 3 минуты и 41 секунду
Это вы хотите, чтобы я признал ваш бред в виде вашего кода
который совершенно не соответсвтует стандартам С и С++?!! Вы уж лучше учите С/С++! Это вам пойдет на пользу! |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
слишком жестко.. имхо, точнее было бы : который по стандарту является зависим от реализации/платформы.. |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
![]() Михаил Жванецкий в таких случаях отвечает: - Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти... ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |