Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
Здравствуйте, Elifant, Вы писали:
E>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
Я знаю книжку по ACE, но она не про сабж, а про то, как там все сложно, и местами — как реализовано в именно ACE. (Дуглас Шмидт, Стивен Хьюстон, "Программирование сетевых приложений на С++).
Практическая полезность этой книжки для меня близка к нулю, но про сабж
E>И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
Да. Еще unsigned/signed char — тоже.
Здравствуйте, SergeMukhin, Вы писали:
E>>> гарантируется ли, что sizeof(char) == 1?
Kaa>> Да. Еще unsigned/signed char — тоже.
S> только это не в байтах она == 1, а в char !
В байтах. sizeof всегда в байтах. Но не обязательно в восьмибитных (aka октет).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
E>>>> гарантируется ли, что sizeof(char) == 1?
Kaa>>> Да. Еще unsigned/signed char — тоже.
S>> только это не в байтах она == 1, а в char !
ПК>В байтах. sizeof всегда в байтах. Но не обязательно в восьмибитных (aka октет).
да, да, конечно. я по привычке байт за 8 бит держу
Здравствуйте, SergeMukhin, Вы писали:
SM>Здравствуйте, Павел Кузнецов, Вы писали:
E>>>>> гарантируется ли, что sizeof(char) == 1?
Kaa>>>> Да. Еще unsigned/signed char — тоже.
S>>> только это не в байтах она == 1, а в char !
ПК>>В байтах. sizeof всегда в байтах. Но не обязательно в восьмибитных (aka октет).
SM>да, да, конечно. я по привычке байт за 8 бит держу
Я знаю процессор, у которого char запаковывается в 24 битное слово (старшие 16 байт -- мусор).
Здравствуйте, Elifant, Вы писали:
E>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами. E>И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
Б. Керниган, Р. Пайк "Практика программирования" — достаточно интересная книженция...
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Шахтер, Вы писали:
Ш>>Я знаю процессор, у которого char запаковывается в 24 битное слово (старшие 16 байт -- мусор).
А>Ничего не понятно. Сколько char'ов запаковываются в 24-битное слово?
Один.
А>Где 16 байт — мусор?
В старшей части слова, в который запакован char.
Собственно говоря, это не столько особенность процессора, сколько компилятора.
Здравствуйте, Elifant, Вы писали:
E>И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
Да! Причём — по определению:
Размеры объектов в С++ выражаются в единицах размера char Таким образом, размер char по определению равен 1...
...По поводу размеров фундаментальных типов гарантируется следующее:
1==siziof(char)<=sizeof(short)<=...
Здравствуйте, Павел Кузнецов, Вы писали: ПК>В байтах. sizeof всегда в байтах. Но не обязательно в восьмибитных (aka октет).
Ни разу не слышал, что байт может быть не равен 8 битам
"Какие ваши доказатеЛства ?" (c) "Красная жара"
Здравствуйте, Forrest_Gump, Вы писали:
E>> И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
FG> Да! Причём — по определению:
FG>
FG> Размеры объектов в С++ выражаются в единицах размера char
FG> Таким образом, размер char по определению равен 1...
FG> ...По поводу размеров фундаментальных типов гарантируется следующее:
FG> 1==siziof(char)<=sizeof(short)<=...
Здравствуйте, Шахтер, Вы писали:
Ш>>>Я знаю процессор, у которого char запаковывается в 24 битное слово (старшие 16 байт -- мусор). А>>Ничего не понятно. Сколько char'ов запаковываются в 24-битное слово? Ш>Один. А>>Где 16 байт — мусор? Ш>В старшей части слова, в который запакован char.
А, т.е. это 16-битный padding...
Ш>Собственно говоря, это не столько особенность процессора, сколько компилятора.
Если я правильно понял, [signed/unsigned] char представляется 24-битным словом, в котором значащими оказываются только младшие 8 бит слова. При этом в int значащие — все 24 бита?..
Тогда это компилятор не C/C++, а какого-то более другого языка.
Здравствуйте, Шахтер, Вы писали:
А>>Тогда это компилятор не C/C++, а какого-то более другого языка.
Ш>Не угадали. C компилятор.
Это может быть компилятором C99, если в unsigned char значащие все 24 бита. А иначе это не C компилятор. Ну, или, конечно, Вы что-то не так рассказали о представлении типов.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Шахтер, Вы писали:
А>>>Тогда это компилятор не C/C++, а какого-то более другого языка.
Ш>>Не угадали. C компилятор.
А>Это может быть компилятором C99, если в unsigned char значащие все 24 бита. А иначе это не C компилятор. Ну, или, конечно, Вы что-то не так рассказали о представлении типов.
Здравствуйте, Elifant, Вы писали:
E>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами. E>И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
В архитектуре PDP байтом была конструкция переменной длины 1..64 бит.
Здравствуйте, Elifant, Вы писали:
E>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
E>>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
L>Mozilla C++ portability guide
L>
L>What follows is a set of rules, guidelines, and tips that we have found to be useful in making C++ code portable across many machines and compilers.
Правда, многое морально устарело.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
L>>What follows is a set of rules, guidelines, and tips that we have found to be useful in making C++ code portable across many machines and compilers.
dad>Правда, многое морально устарело.
Есть такое дело, документ довольно старый... Но общее представление дает. Касательно переносимости у разработчиков Мозиллы также интересно посмотреть реализацию Netscape Portable Runtime.
Здравствуйте, Шахтер, Вы писали:
А>> Это может быть компилятором C99, если в unsigned char значащие все 24 бита. А>> А иначе это не C компилятор. Ну, или, конечно, Вы что-то не так А>> рассказали о представлении типов.
Ш> Это почему?
Потому что, как и в C++, в C все биты unsigned char должны быть значащими
(6.2.6.1/3-4, сноска 40, 6.2.6.2).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Шахтер, Вы писали:
А>>> Это может быть компилятором C99, если в unsigned char значащие все 24 бита. А>>> А иначе это не C компилятор. Ну, или, конечно, Вы что-то не так А>>> рассказали о представлении типов.
Ш>> Это почему?
ПК>Потому что, как и в C++, в C все биты unsigned char должны быть значащими ПК>(6.2.6.1/3-4, сноска 40, 6.2.6.2).
А если нет, то что это уже не C а Паскаль? Эпиграф из Страуструпа.
The first thing we do, letґs
kill all the language lawyers.
– Henry VI, part II
Здравствуйте, Шахтер, Вы писали:
ПК>>в C все биты unsigned char должны быть значащими (6.2.6.1/3-4, сноска 40, 6.2.6.2).
Ш>А если нет, то что это уже не C а Паскаль?
Не Паскаль: спецификации Паскаля этот язык тоже соответствовать не будет.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Я, всё-таки, позволю себе напомнить, что существует огромное многообразие вычислительных систем самого разного назначения, так что неудивитнльно, что нередко C адаптируют для эффективного использования аппаратных возможностей процессора, вводя в язык элементы, не предусмотренные станддартом.
Здравствуйте, Elifant, Вы писали:
E>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами. E>И заодно задам вопрос по теме: гарантируется ли, что sizeof(char) == 1?
Стандарт ANSI C++?
Тут ведь вот какая проблема, любая промышленная программа зачастую оказывается завязана на неперносимые вещи — СУБД, железо, GUI, разные системные сервисы. А дальше, исходя из здравого смысла, надо стремиться все зависмые вещи стараться окружить врапперами, ну а все остальное писать на как можно более стандартном С++.
Здравствуйте, Xentrax, Вы писали:
E>>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
X>Стандарт ANSI C++?
Стандарт С++ — это, конечно, хорошо, и для переносимости его нужно придерживаться. Однако этот самый стандарт вещь очень расплывчатая, тут тебе не Ява, где зафиксированы размеры типов, их внутреннее устройство и все прочее. В С++, если я не ошибаюсь, никак не зафиксированы размеры некоторых типов, а также порядок байт в их представлении. Уже даже из-за этого многие существующие программы будут непереносимы, имхо.
Это вещи известные, а мне бы хотелось прочитать про подобные, но более хитрые и неочевидные.
Проще говоря — чего делать нельзя, так как это делается (хранится, передается, трактуется...) по-разному на разных архитектурах.
E>>>Посоветуйте, пожалуйста, статьи по написанию переносимых программ с использованием С++. Интересует переносимость как между компиляторами, так и между платформами.
X>>Стандарт ANSI C++?
E>Стандарт С++ — это, конечно, хорошо, и для переносимости его нужно придерживаться. Однако этот самый стандарт вещь очень расплывчатая, тут тебе не Ява, где зафиксированы размеры типов, их внутреннее устройство и все прочее. В С++, если я не ошибаюсь, никак не зафиксированы размеры некоторых типов, а также порядок байт в их представлении. Уже даже из-за этого многие существующие программы будут непереносимы, имхо.
Если бы только это....
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, Шахтер, Вы писали:
Ш>Не угадали. C компилятор.
То есть, как я понимаю, адресуемая единица — это машинное слово (24бит), а чем оно заполнено — int или char — это уже по барабану.
Значит, на этой платформе sizeof(int) = sizeof(char) = 1, зато CHAR_BITS = 24.
Да?
Чему там будет равен sizeof(short)? Вообще, по стандарту, short — это 16-битное или 2-байтное (необязательно октетное)?
А что это за машина, кстати говоря... IBM 360? БЭСМ 6?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Шахтер, Вы писали:
Ш>>Не угадали. C компилятор.
К>То есть, как я понимаю, адресуемая единица — это машинное слово (24бит), а чем оно заполнено — int или char — это уже по барабану. К>Значит, на этой платформе sizeof(int) = sizeof(char) = 1, зато CHAR_BITS = 24. К>Да? К>Чему там будет равен sizeof(short)? Вообще, по стандарту, short — это 16-битное или 2-байтное (необязательно октетное)?
По стандарту sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long), значит на той платформе sizeof(short) == 1
К>А что это за машина, кстати говоря... IBM 360? БЭСМ 6?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Шахтер, Вы писали:
Ш>>Не угадали. C компилятор.
К>То есть, как я понимаю, адресуемая единица — это машинное слово (24бит), а чем оно заполнено — int или char — это уже по барабану. К>Значит, на этой платформе sizeof(int) = sizeof(char) = 1, зато CHAR_BITS = 24. К>Да? К>Чему там будет равен sizeof(short)? Вообще, по стандарту, short — это 16-битное или 2-байтное (необязательно октетное)?
К>А что это за машина, кстати говоря... IBM 360? БЭСМ 6?
Долго ржал.
Есть такое семейство DSP процессоров у Моторолы. DSP563xx.
Выдержки из документации по компилятору (процессор весьма нестандартный и C для него тоже весьма нестандартный).
Если интересны все фичи, качай мануаль.
Совместимость, совместимось ... На том свете она будет.
char, short, int and long are all integral types, supporting all implicit (automatic) conversions.
— although the char type is 8 bit, each char occupies one memory word, because the DSP56xxx has no instructions to access one byte efficiently.
— char and short are treated as 8-bit and 16-bit int respectively.
The DSP563xx supports 24 and 16-bit arithmetic modes and 24 and 16-bit addressing modes. The c563 C compiler supports the following models for these modes:
24-bit arithmetic and 24-bit addresses 24-bit model
16-bit arithmetic and 24-bit addresses 16/24-bit model
16-bit arithmetic and 16-bit addresses 16-bit model
The compiler supports the additional data type _fract to do fixed point arithmetic without the use of (expensive) special libraries. The implementation of this data type depends on the selected family member. Fractions can have values between -1 and +1 and can be used like integers and floating points, and combine little code overhead with a high dynamic range.
/* constant with value 0.3333... */
const _fract one_third = 1.0/3;
Fixed point arithmetic follows the rules for floating point calculations.
The DSP56xxx family supports circular buffers, for which no representation in C exists. A circular buffer is a linear array that can be accessed using modulo address arithmetic, i.e., a pointer that wraps-around automatically, thus creating a virtual circular buffer. To allow you to use circular buffers in C, c563 supports the data type _circ as an extended data type.
Example:
int _circ Circ_Buf[5];
int _circ *Ptr_to_Circ_Buf = Circ_Buf;
Here, Circ_Buf is declared as a circular buffer. The compiler will emit alignment directives to ensure circular buffers will start at addresses that are a multiple of the smallest power of two that is equal to or larger than the buffer size. The buffer size is kept by the compiler and will be used to control pointer arithmetic of pointers that are assigned to the buffer later.
In the above example, the circular pointer Ptr_to_circ_Buf will be stored in an R-type register and the proper modulo value will be stored in its corresponding M-type register. Operations on the circular pointers can be done using the usual C pointer arithmetic with the difference that the pointer will wrap.
When the circular buffer is accessed using a circular pointer, it will wrap at the buffer limits.
Example:
while( *Ptr_to_Circ_Buf++ );
Indexing in the circular buffer, using an integer index, is treated equally to indexing in a non-circular array.
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, Кодт, Вы писали:
К>>Здравствуйте, Шахтер, Вы писали:
Ш>>>Не угадали. C компилятор.
К>>То есть, как я понимаю, адресуемая единица — это машинное слово (24бит), а чем оно заполнено — int или char — это уже по барабану. К>>Значит, на этой платформе sizeof(int) = sizeof(char) = 1, зато CHAR_BITS = 24. К>>Да? К>>Чему там будет равен sizeof(short)? Вообще, по стандарту, short — это 16-битное или 2-байтное (необязательно октетное)?
К>>А что это за машина, кстати говоря... IBM 360? БЭСМ 6?
Ш>Долго ржал.
Ш>Есть такое семейство DSP процессоров у Моторолы. DSP563xx.
я бы даже расширил — DSP56xxx
Ш>http://www.tasking.com/products/DSP56xxx/index.html
А ты реально программируешь под этот DSP?
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, Oval, Вы писали:
O>>А ты реально программируешь под этот DSP?
Ш>Программировал. Года четыре назад.
А для каких приложений?
Здравствуйте, Oval, Вы писали:
O>Здравствуйте, Шахтер, Вы писали:
Ш>>Здравствуйте, Oval, Вы писали:
O>>>А ты реально программируешь под этот DSP?
Ш>>Программировал. Года четыре назад. O>А для каких приложений?