9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
|
||||||||||||||||
1 | ||||||||||||||||
Пара вопросов по С++16.07.2010, 09:03. Показов 2917. Ответов 30
Метки нет Все метки)
(
возникло несколько вопросов, с которыми что то не могу никак разобраться
1. Как происходит выравнивание при создании структуры?
2. Про добавление константности пусть есть класс:
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
16.07.2010, 09:03 | |
Ответы с готовыми решениями:
30
Пара глупых вопросов Пара вопросов по итераторам пара вопросов по GUI |
![]() ![]() |
|
16.07.2010, 09:37 | 2 |
Каждое поле выравнивается на значение, соответствующее выравниванию типа поля. Вся структура будет выравниваться на максимальное из выравниваний полей.
В случае первой структуры у тебя будет: 8 байт "a", 4 байта "b", 1 байт "c" + 3 байта дырка. Размер (sizeof) структуры 16 Во втором случае: 1 байт "a", 3 байта дырка (чтобы поле "b" оказалось выровненным на 4 байта), 4 байта "b", 8 байт "c". Размер так же 16. Если после поля "b" добавишь ещё один char, то после него появится дополнительная в 7 байт, чтобы поле "c" оказалось выровненным на 8 байт Может проблема в том, что в конце printf'А надо перевод строки воткнуть (без него вывод буфферизуется и на экран не выводится, а потом у тебя экран пропадает)
0
|
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
|
||||||
16.07.2010, 09:55 [ТС] | 3 | |||||
спасибо за разъяснение, в первой части я примерно так и предполагал, просто не был уверен.
по поводу второго -- там дело не в том, что что то на экран не выводится -- в оригинале не вывод на экран, это просто для проверки, а вопрос в том,почему после приведения static_cast<const A>(a) тип полученного выражения будет A, а не const A. Проверял так:
0
|
![]() 2343 / 1716 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
16.07.2010, 11:25 | 5 |
cv квалификаторы не влияют на тип объекта, они лишь добавляют соответсвующие атрибуты к самому объекту.
0
|
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
|
||||||
16.07.2010, 12:04 [ТС] | 6 | |||||
мм..ну формально типы const A и A - разные, кроме того,
0
|
![]() 2924 / 1273 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
16.07.2010, 12:16 | 7 | |||||
Компилятор GCC 4.5.0.
0
|
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
|
|
16.07.2010, 12:17 [ТС] | 8 |
Да, добивался я этого. Я понял, что нужно было приводить к const A&, а не к const A
Остался только вопрос -- почему?
1
|
![]() 2343 / 1716 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|||||||||||
16.07.2010, 12:30 | 9 | ||||||||||
Это не так:
A и A& - это два разных типа.
1
|
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
|
|
16.07.2010, 12:39 [ТС] | 10 |
понял, спасибо за разъяснение
0
|
![]() 3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
16.07.2010, 21:43 | 11 |
Во-первых, непонятно, почему вы для навешивания const используете static_cast, а не const_cast, который для этого предназначен.
Во-вторых, и const_cast здесь не срабатывает. Компилятор ругается вот таким образом: error C2440: 'const_cast' : cannot convert from 'main::A' to 'const main::A' 1> Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast. Хотя в книжках пока ничего не нашел по этому поводу.
0
|
![]() 2343 / 1716 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
16.07.2010, 22:32 | 12 |
Наоборот, const_cast предназначен для снятия константности.
Константность на неконстантный объект никак не "навешать".
0
|
![]() 3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
17.07.2010, 11:35 | 13 |
В некоторых источниках, ссылающихся на стандарт, говорится, что «оператор const_cast производит приведение типа, при котором удаляются или добавляются cv-квалификаторы».
Да и на форумах многие так его трактуют. Интересно все же что сказано в стандарте (я, признаться, не силен в тарабарском). И, кстати, существуют ли переводы стандарта на русский?
0
|
![]() 2343 / 1716 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
17.07.2010, 11:58 | 14 |
Стандарта под рукой нет, но со 99% уверенностью могу сказать что, const_cast может только снять константность, кроме того, вот выдержка с MSDN:
![]() Не встречал, да и зачем? Это довольно таки специфический документ, чтобы его переводить.
1
|
![]() 3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
17.07.2010, 14:29 | 15 |
Из своего опыта я вывел, что в программировании нет ничего вреднее, чем основываться на недоказанных предположениях.
Надо будет распечатать стандарт и почитывать на ночь. На каком-то сайте один товарищ несколько лет назад грозился перевести, но видимо что-то у него не сложилось.
0
|
![]() 2343 / 1716 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
17.07.2010, 14:43 | 16 |
Это верно, но в данном случае, у меня нет никаких сомнений в том, для чего нужен const_cast.
Вот нарыл фрагмент из С++98: ![]()
0
|
![]() ![]() |
|
17.07.2010, 15:02 | 17 |
Если посмотреть на переводную техническую литературу, то зачастую многие вещи на русском языке попросту не понять, не видя оригинала. В случае стандарта это будет полный трындец.
Как-то мне довелось читать документацию от велосипедной цепи (процесс установки) на английском. Я не считаю себя большим специалистом в английском языке, но без поллитры и консилиума в три рыла это не переводилось. Лишь какое-то время спустя я узнал, что эта документация родилась после того, как голландцы перевели её с японского на английский.
0
|
![]() 3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
17.07.2010, 15:42 | 18 |
Ну, он собирался его как Библию издать: слева священный текст - справа перевод.
Библию перевели же, а она поспецифичнее будет.
0
|
![]() 3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
18.07.2010, 00:18 | 20 |
0
|
18.07.2010, 00:18 | |
Помогаю со студенческими работами здесь
20
Пара вопросов по функторам stl вставление строк и пара вопросов Пара вопросов о рандомайзере и RadioButton Пара вопросов про массивы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |