Модераторы: bsa

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Микс, Разные простые вопросы 
V
    Опции темы
xvr
Дата 2.7.2011, 08:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @  1.7.2011,  16:04 Найти цитируемый пост)
стественно! Зависит от используемой платформы. Ни в С, ни в С++ не гвоорится о размерах данных.

здесь речь идет не о размере, а о выравнивании. И о том, что второе совсем не обязательно равно первому. Например классическая х86 система не требует выравнивания (т.е. align должен быть на 1), хотя и приветствует  smile 
 
PM MAIL   Вверх
Сыроежка
Дата 3.7.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  2.7.2011,  00:11 Найти цитируемый пост)
Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова.
(я по крайней мере не нашел, а вы ничего привести не смогли!)



Это вы сами с собой дискусируете?! Я нигде не гворил, что указатель должен быть выравнен на границу слова! Я приводил пример, ято если указатель является производным от типа int, то он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!


PM MAIL   Вверх
mes
Дата 3.7.2011, 18:02 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  14:45 Найти цитируемый пост)
он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!

но при этом выровнен не обязательно по размеру слова.. 



--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 3.7.2011, 18:10 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  3.7.2011,  18:02 Найти цитируемый пост)
Цитата(Сыроежка @  3.7.2011,  14:45 )
он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!


но при этом выровнен не обязательно по размеру слова.. 


Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. 
То есть чтобы было понятно, на 32 -битовой платформе Intel тип int может равняться 16 битам. Но это соответсвует размеру регистра AX, то есть значению слова на той платформе (в данном случа 16-битовой), для совместимостью с которой создается компилятор.
PM MAIL   Вверх
mes
Дата 3.7.2011, 18:16 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  17:10 Найти цитируемый пост)
Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. 

Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны..  smile 



--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 3.7.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  3.7.2011,  18:16 Найти цитируемый пост)
Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны..  


Я не встречал еще ассемблера, где при выделении памяти для слова, как, например,

Код

dw ?
или

для Intel

Код

ds  f


для IBM проходило выравнивание не по размеру слова!

PM MAIL   Вверх
mes
Дата 3.7.2011, 19:56 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  17:20 Найти цитируемый пост)
Я не встречал еще ассемблера, где при выделении памяти для слов ... проходило выравнивание не по размеру слова!

и что это доказывает ?




--------------------
PM MAIL WWW   Вверх
volatile
Дата 4.7.2011, 06:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  3.7.2011,  15:45 Найти цитируемый пост)
Я нигде не гворил, что указатель должен быть выравнен на границу слова


Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Указатель для типа int должен быть выровнен на границу слова.


без комментариев.
PM MAIL   Вверх
xvr
Дата 4.7.2011, 13:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



[QUOTE=Сыроежка,3.7.2011,  18:20]
Цитата(mes @  3.7.2011,  18:16 Найти цитируемый пост)

Я не встречал еще ассемблера, где при выделении памяти для слова, как, например,

Код

dw ?
или

для Intel

Код

ds  f

для IBM проходило выравнивание не по размеру слова!

Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds  smile Хочу полюбоваться  smile 

al.s
Код

    .text
    .byte 1
    .word 0x55aa
    .byte 0xa5

Код

> gcc -c al.s -o al.o
> objdump -s al.o                                                                                 
 
al.o:     file format elf64-x86-64
 
Contents of section .text:
 0000 01aa55a5                             ..U.    
как видим - никаких выравниваний  smile 

PM MAIL   Вверх
Сыроежка
Дата 5.7.2011, 17:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  4.7.2011,  06:28 Найти цитируемый пост)
Я нигде не гворил, что указатель должен быть выравнен на границу слова


Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Указатель для типа int должен быть выровнен на границу слова.


без комментариев. 


Там все ясно было написано, что значение указателя на тип int дожно быть выравнено на границу слова в соответствии с выравниванием типа int.
.
PM MAIL   Вверх
Сыроежка
Дата 5.7.2011, 18:56 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  2.7.2011,  00:11 Найти цитируемый пост)
Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова.
(я по крайней мере не нашел, а вы ничего привести не смогли!)

А применять стандарт С99 к С++ не совсем корректно. (читай совсем не)
С++ если и произошел от С, то никак не от С99 smile 
это 2 разных языка.

Добавлено @ 00:15
А выборочные выдержки из стандарта С99, без определения основных терминов, вообще не могут рассматриваться в качестве аргументов в споре


У меня такое впечатление, что я имею дело не с адекватным человеком! Я говорил, что значение   указателя должны быть выравнено согласно выравниванию типа данных, на которое он указывает. Я несколько раз специально для вас это повторял и в качестве примера приводил указатель на тип int.  Во-вторых, совершенно не понятно, какие "определения  основных терминово" вам нужны? Любое цитирование стандарта предполагает ссылки на термины стандарта. Так что цитировать стандарт - это всегда корректно. В-третьих, стандарт С++ также требует выравнивание значений указателей в соответствии с выравниванием типов, на которые эти указатели указывают. Джае оставляя в стороне стандарты, а просто руководствуясь обычным здравым смыслом, очевидно, что в С и в С++ должно быть одно и то же выравнивание, так как модули на С и С++ очнь часто собираются в один проект. В противном случае любой проект, состоящий из смешанных модулей, был бы некорректным!

PM MAIL   Вверх
volatile
Дата 5.7.2011, 23:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  5.7.2011,  18:56 Найти цитируемый пост)
У меня такое впечатление, что я имею дело не с адекватным человеком!

Буквально с больной головы на здоровую smile 

Вам уже все ясно объяснили. Неплохо было бы признать свою ошибку.
Время на вас тратить не хочу больше. 
Извините.


PM MAIL   Вверх
Сыроежка
Дата 6.7.2011, 14:54 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(xvr @  4.7.2011,  13:09 Найти цитируемый пост)
Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds  smile Хочу полюбоваться  smile 

al.s
Выделить всёБез подсветки
    
    .text
    .byte 1
    .word 0x55aa
    .byte 0xa5

Выделить всёБез подсветки

    
> gcc -c al.s -o al.o
> objdump -s al.o                                                                                 
 
al.o:     file format elf64-x86-64
 
Contents of section .text:
 0000 01aa55a5                             ..U.    
как видим - никаких выравниваний  smile 


Вы очевидно относиетсь к тем программистам, опыт которых ограничен лишь работой на одной платформе, и которые начинают свято верить, что других аппаратных архитектур и операционных систем в природе просто не существует!smile
Я вам на самом деле уже все указал, просто вы не внимательно читаете, что вам другие пишут!
Есть такие вычислительные машины, как IBM mainframe. В настоящее время это серия Z, а операционная система соответственно называется z/OS. Так на этой платформе обращение к памяти, не выравненное соответсвующим образом приводит к аварийному завершению программы. Например, если вы в ассемблере для IBM, который называется HLASM ( от слов High Level Assembler ), зададите директиву

Код

WORDS    DS 3F


то память будет выравнена на границу слова. Если у вас есть знакомые, которые имеют дело с 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 памяти по нулевым адресам.

Так что смотрите на вещи ширше!smile И не думайте, что весь мир ограничен той платформой, на которой вы работаете!smile

Добавлено через 3 минуты и 41 секунду
Цитата(volatile @  5.7.2011,  23:15 Найти цитируемый пост)
Вам уже все ясно объяснили. Неплохо было бы признать свою ошибку.
Время на вас тратить не хочу больше. 
Извините.


Это вы хотите, чтобы я признал ваш бред в виде вашего кода


Код

int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);



который совершенно не соответсвтует стандартам С и С++?!! Вы уж лучше учите С/С++! Это вам пойдет на пользу!
PM MAIL   Вверх
mes
Дата 6.7.2011, 19:00 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  6.7.2011,  13:54 Найти цитируемый пост)
который совершенно не соответсвтует стандартам С и С++?!!

слишком жестко..  имхо, точнее было бы : который по стандарту является зависим от реализации/платформы.. 



--------------------
PM MAIL WWW   Вверх
Dov
Дата 6.7.2011, 20:30 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Сыроежка @  6.7.2011,  14:54 Найти цитируемый пост)
Вы уж лучше учите С/С++! Это вам пойдет на пользу!
   smile 

Михаил Жванецкий в таких случаях отвечает:
-  Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти... smile  



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0920 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.