Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Как вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 17:52 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
TimeCoderКак вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так? Вообще, стандартом не описано какие конкретно размеры у short и char. Так что зависит от платформы. Кроме того выравнивание тоже зависит от платформы и компилятора. На x86 при включенной оптимизации по скорости размеры структур должны быть 4 и 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 18:37 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
TimeCoder, А никак не надо думать, стандарт это не оговаривает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 19:18 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyTimeCoderКак вы думаете, что будет на экране?:-) У меня только один вопрос: ПОЧЕМУ так? Вообще, стандартом не описано какие конкретно размеры у short и char. Так что зависит от платформы. Кроме того выравнивание тоже зависит от платформы и компилятора. На x86 при включенной оптимизации по скорости размеры структур должны быть 4 и 3. У char как раз размер определен. 1 байт. А вот у структуры, содержащей 3 char — уже нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 19:21 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
У меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 19:59 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
MasterZivУ char как раз размер определен. 1 байт. Да, про char это я забыл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:07 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
TimeCoderУ меня в MS VS2012 выводится 4 и 3. Почему во втором случае не произошло выравнивания? Потому что на x86 выравнивание char - 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:08 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПотому что на x86 выравнивание char - 1 Тогда почему у первой структуры размер 4? Я бы понял, если бы он был 5 или 3, но 4?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:18 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovТогда почему у первой структуры размер 4? Я бы понял, если бы он был 5 или 3, но 4?.. Выравнивания членов структур влияют на размер структуры не на прямую . У структуры выравнивание равно максимальному выравниванию членов (также обычно есть ограничение сверху заданное компилятором). Из-за этого члены с меньшим выравниванием упаковываются если идут подряд, а если нечего упаковывать, то дополняются пустотой до выравнивания структуры. Поэтому у структуры 1 выравнивание 2 (2 у short, 1 - у char), а размер структуры получается 4 (2 - размер short + 1 размер char + 1 заполняющий байт ). Если бы было например, short, char, char тогда размер структуры был бы тоже 4 (2 - размер short + 2 - размер двух упакованных подряд char) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:37 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЯ бы понял, если бы он был 5 или 3, но 4?.. Размер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:41 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyРазмер структур всегда кратен степени двойки (если не играться с pragma pack), потому что на большинстве платформ скорость доступа таким структурам больше. А, ну кроме структур состоящих только из char :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:43 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyРазмер структур всегда кратен степени двойки Если к первой структуре добавить ещё short, он станет 6. Э?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:47 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:51 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЯ бы понял, если бы он был 5 или 3, но 4?.. А можете описать логику, по которой могло бы получиться 5? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:54 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyДа 6 - не степень двойки. Anatoly MoskovskyА можете описать логику, по которой могло бы получиться 5? short int можно дополнить до int чтобы вытягивался из структуры быстрее. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:56 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПотому что на x86 выравнивание char - 1 Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 21:00 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAnatoly MoskovskyДа 6 - не степень двойки. Так я не про степень двойки, а про кратность степени двойки ) Dimitry SibiryakovAnatoly MoskovskyА можете описать логику, по которой могло бы получиться 5? short int можно дополнить до int чтобы вытягивался из структуры быстрее. Понятно. Но это неверная логика, в чем можно убедиться если рассмотреть массив из двух элементов этой структуры. В случае размера структуры 5 второй элемент массива будет не выровнен. А в случае если размер 4 (точнее, соответствует описанным мной выше правилам) то выравнивания любых элементов массива, а также членов, одинаковы и равны наиболее оптимальному для платформы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 21:08 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
TimeCoderAnatoly MoskovskyПотому что на x86 выравнивание char - 1 Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных? Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться. Иногда от этого правила отходят для long long и double. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 21:08 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
TimeCoderТ.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных? Почему же от последнего? От всех зависит. Я выше описал как именно. 14786591 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 21:10 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Общее правилоTimeCoderпропущено... Т.е. выравнивание размера класса происходит в зависимости от последнего объявленного поля данных? Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться. Иногда от этого правила отходят для long long и double.Ну не совсем так, это может зависеть от реализации. А вообще кроме sizeof есть еще и alignof ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 07:16 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
?Общее правилопропущено... Нет. Общее правило для всех компиляторов такое - каждый элемент в массиве структур должен иметь смещение от начала этого массива кратное его размеру . А все остальное уже свистопляски вокруг этого правила. Вот и думайте как компилятор будет этого добиваться. Иногда от этого правила отходят для long long и double.Ну не совсем так, это может зависеть от реализации. А вообще кроме sizeof есть еще и alignof Ну есть и что, есть ещё и http://en.cppreference.com/w/cpp/types/alignment_of От реализации компиляторов зависит только: или это по умолчанию обязательно делает для ускорения (x86), или это всегда обязательно делается, чтобы хотя бы работало (CUDA GPU). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 13:09 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Общее правило, А кстати на каких платформах выравнивание бывает больше размера типа? Я слышал что такие есть, но интересно конкретно на каких. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 13:30 |
|
||
|
Странный sizeof объекта
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyОбщее правило, А кстати на каких платформах выравнивание бывает больше размера типа? Я слышал что такие есть, но интересно конкретно на каких. Что бы больше, не помню. Все-таки экономия памяти тоже не лишнее и для его объема, и для пропускной способности, и для вместимости кэша. А из правила следуют два условия: 1) смещение элемента внутри структуры должно быть кратно размеру этого элемента; 2) размер структуры должен быть кратен наибольшему размеру элемента находящемуся в нем(исключения long long и double); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 13:40 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=73&tid=2020006]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 403ms |

| 0 / 0 |
