Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Какой из compile-time способов определения размера в количестве элементов массива в статической памяти обычно используете? 1. Можно просто размер массива поделить на размер одного элемента, но это сработает и для обычного указателя, что не нужно: #define lengthof(x) (sizeof(x) / sizeof((x)[0])) 2. Можно попробовать создать холостой массив ссылок на функцию принимающую на вход массив, обычный указатель уже не пройдет, как и пользовательский тип с определенным оператором индексирования operator[] Макрос из Хрома: Код: plaintext 1. 2. 3. Или с использованием буста: Код: plaintext 1. 2. 3. 3. По действию тоже что и 2, или может чем-то отличается? Макрос из Уилсона, расширение STL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 4. Но что меня больше всего удивило, что никто не использует простую функцию без всяких макросов: Код: plaintext 1. На фига эти дефайны и бусты. Или есть причины её не использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 00:21 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-time4. Но что меня больше всего удивило, что никто не использует простую функцию без всяких макросов: Код: plaintext 1. На фига эти дефайны и бусты. Или есть причины её не использовать?почему никто? я использую, например. Тоже не понимаю, на фига все эти макросы нужны, в 21м то веке )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 00:35 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-timeКакой из compile-time способов определения размера в количестве элементов массива в статической памяти обычно используете? 1. Можно просто размер массива поделить на размер одного элемента, но это сработает и для обычного указателя, что не нужно: #define lengthof(x) (sizeof(x) / sizeof((x)[0])) Этот и только этот. Все остальные предложенные методы чушь, глупость и гадость. Нафига накручивать шаблоны на простой статический массив? А уж тянуть для этой цели буст это вообще уму не постижимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 01:37 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
egorychCompile-time4. Но что меня больше всего удивило, что никто не использует простую функцию без всяких макросов: Код: plaintext 1. На фига эти дефайны и бусты. Или есть причины её не использовать?почему никто? я использую, например. Тоже не понимаю, на фига все эти макросы нужны, в 21м то веке )) Тут как я понял дело в том, что #define это constexpr, а такая функция - нет. И в MS VS 2012 ещё не запили само ключевое слово constexpr. По этому в "умных книжках" и оупенсорсных проектах используют template и его ещё в #define оборачивают. Для GCC: http://stackoverflow.com/questions/6376000/how-does-this-array-size-template-work Код: plaintext 1. Ну и привели ещё один извращенный вариант с decltype :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 01:39 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlCompile-timeКакой из compile-time способов определения размера в количестве элементов массива в статической памяти обычно используете? 1. Можно просто размер массива поделить на размер одного элемента, но это сработает и для обычного указателя, что не нужно: #define lengthof(x) (sizeof(x) / sizeof((x)[0])) Этот и только этот. Все остальные предложенные методы чушь, глупость и гадость. Нафига накручивать шаблоны на простой статический массив? А уж тянуть для этой цели буст это вообще уму не постижимо. Но он съест и обычный указатель, и пользовательский тип с определенным оператором индексирования. А чем лучше накручивать #define вместо template? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 01:42 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-timeТут как я понял дело в том, что #define это constexpr, а такая функция - нет.Ну если компилятор умный, то он в принципе, наверное, при включеной оптимизации, может быть и сможет превратить эту функцию в константу. Compile-timeНо он съест и обычный указатель, и пользовательский тип с определенным оператором индексирования.Я не вижу проблемы в том, что дефайн на sizeof съест и обычный указатель. Этот дефайн тебе выдаст размер в единичку, что будет чистой правдой. Compile-timeА чем лучше накручивать #define вместо template? Ну во первых, я немножко соврал в первом ответе. Такой дефайн я не использую никогда. Я всегда прямо по месту пишу формулу из sizeof(). В этом случае я всегда сразу вижу что в данном цикле for я работаю с размером именно статического массива а не какого-то там объекта или другого конструкта. Во вторых, в трех первых твоих примерах кроме template ты вынужден использовать #define... И смысл тогда был template писать? В третьих, ты заранее объявляешь что твоя функция возвращает size_t. Что не всегда равняется unsigned int, а размер массива обычно нужен в циклах, где как раз unsigned int и является предпочтительным типом. Конструкция основаная на sizeof() позволяет компилятору автоматически подбирать тип константы. Ну и в конце-концов: я ненавижу templates. Считай это религией :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:20 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-timeА чем лучше накручивать #define вместо template?ничем, не слушай White Owl, когда он говорит про шаблоны и исключения - у него религиозное неприятие этих понятий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:21 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
А что, простое Код: sql 1. 2. ныне считается некошерным?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:32 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА что, простое Код: sql 1. 2. ныне считается некошерным?..почему тогда уж не константу объявить?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:35 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА что, простое Код: sql 1. 2. ныне считается некошерным?.. Если у тебя один-единственный статический массив во всей программе, то можно и так жить. А если у тебя два массива, или три.... Тогда ты будешь каждый раз сидеть и вспоминать какая из констант, к какому массиву относится. И молись чтобы не перепутать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:37 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlCompile-timeТут как я понял дело в том, что #define это constexpr, а такая функция - нет.Ну если компилятор умный, то он в принципе, наверное, при включеной оптимизации, может быть и сможет превратить эту функцию в константу. Да, GCC так и делает. Он хоть и знает constexpr и сам его подставляет. White OwlCompile-timeНо он съест и обычный указатель, и пользовательский тип с определенным оператором индексирования.Я не вижу проблемы в том, что дефайн на sizeof съест и обычный указатель. Этот дефайн тебе выдаст размер в единичку, что будет чистой правдой. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. В случае с темплейтами - оно в compile-time выдаст ошибку, что и нужно. White OwlCompile-timeА чем лучше накручивать #define вместо template? Ну во первых, я немножко соврал в первом ответе. Такой дефайн я не использую никогда. Я всегда прямо по месту пишу формулу из sizeof(). В этом случае я всегда сразу вижу что в данном цикле for я работаю с размером именно статического массива а не какого-то там объекта или другого конструкта. Во вторых, в трех первых твоих примерах кроме template ты вынужден использовать #define... И смысл тогда был template писать? В третьих, ты заранее объявляешь что твоя функция возвращает size_t. Что не всегда равняется unsigned int, а размер массива обычно нужен в циклах, где как раз unsigned int и является предпочтительным типом. Конструкция основаная на sizeof() позволяет компилятору автоматически подбирать тип константы. Ну и в конце-концов: я ненавижу templates. Считай это религией :) 1. Ну использование ARRAY_SIZE/arr_size() тоже говорит, что 100% работа идет со статическим массивом, кстати в отличае от 1го варианта который съест и new char[] и vector. 2. Только второй вариант не ест ненужные типы и работает под GCC/MSVS 3. Т.к. это compile-time, то в любом случае все приведется к константе нужного типа. sizeof - так же возвращает size_t и так же приводит к нужному типу если это возможно. И что вообще ничего из STL и даже умные указатели с контейнерами не используете из-за шаблонов? :) PS насчет предпочтительного типа: Насколько я помню переполнение unsigned - строго специфицировано, а signed - нет и тут компилятор может хорошо оптимизировать. Само же переполнение в любом случае логический крах, если иное явно не предусмотрено, и в случае signed - будет run-time exception, а в случае unsigned - все будет молча. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 02:44 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlВ третьих, ты заранее объявляешь что твоя функция возвращает size_t. Что не всегда равняется unsigned int, а размер массива обычно нужен в циклах, где как раз unsigned int и является предпочтительным типом. С какого перепугу в цикле unsigned int предпочтительнее чем size_t? size_t - специально предназначен для индексов, размеров массивов и т.д. А unsigned int не на всех платформах даже может вместить размер объекта в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 06:37 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА что, простое Код: sql 1. 2. ныне считается некошерным?.. потому что часто удобно писать вот так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 13:36 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Вообще для циклов по коллекции будет следующая конструкция: Код: plaintext 1. Правда в GCC 4.5.1 она не работает, а в MSVS 2012 почему-то начинает с индекса i =1 для массивов, а для std::vector начинает с i = 0, но не инкрементирует его :) А вот это скорее понадобится для следующего: Код: plaintext 1. 2. 3. 4. 5. Но ничего из этого сообщения в MSVS пока не работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 15:31 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-time, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 16:30 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Ну и цикл по массиву, если уж зашла речь: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 16:36 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCompile-time, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Не знал. Самое простое :) Но вот в MSVS оно не constexpr, т.е. на этой строчке загинается: char a2[boost::size(a1)]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 16:47 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНу и цикл по массиву, если уж зашла речь: Код: plaintext 1. 2. 3. 4. 5. 6. Это как раз то, что в новом стандарте for(auto c : a)? Кстати, а в бустовом варианте и в новом стандарте стандарте: 1. индекс всегда начинается с 0? 2. нельзя идти по массиву с конца или с шагом большим 1? 3. нужен as_array для устранения двойной трактовки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 16:51 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-timeЭто как раз то, что в новом стандарте for(auto c : a)? Кстати, а в бустовом варианте и в новом стандарте стандарте: 1. индекс всегда начинается с 0? 2. нельзя идти по массиву с конца или с шагом большим 1? 3. нужен as_array для устранения двойной трактовки? 1. Если индекс начинается не с 0, то это не С++, а паскаль какой-то - ересь короче :) 2. Не в курсе 3. as_array это бустовское. Как в c++11 - не знаю То что VS не поддерживает boost::size() в качестве размера массива, это плохо и странно. Потому что gcc с выключенным C++11 - поддерживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 21:58 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCompile-timeЭто как раз то, что в новом стандарте for(auto c : a)? Кстати, а в бустовом варианте и в новом стандарте стандарте: 1. индекс всегда начинается с 0? 2. нельзя идти по массиву с конца или с шагом большим 1? 3. нужен as_array для устранения двойной трактовки? 1. Если индекс начинается не с 0, то это не С++, а паскаль какой-то - ересь короче :) 2. Не в курсе 3. as_array это бустовское. Как в c++11 - не знаю То что VS не поддерживает boost::size() в качестве размера массива, это плохо и странно. Потому что gcc с выключенным C++11 - поддерживает. 1. В MSVS12 цикл for(auto i: v) начинается с 1 для массивов, и не инкрементиться для векторов, спрашивается на фига его вообще там сделали :) Или может я чего не понял. Да я надеялся, что уж VS12 будет держать и constexpr и соответственно boost::size(), но нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 22:16 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-time1. В MSVS12 цикл for(auto i: v) начинается с 1 для массивов, и не инкрементиться для векторов, спрашивается на фига его вообще там сделали :) Или может я чего не понял. Это уж слишком явный баг компилятора. Ну или "чего не понял" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 22:50 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Compile-time Код: plaintext 1. 2. 3. А почему это "неверно"? Что просил, то и получил. Не надо работать с указателями как со статическими массивами и все. Compile-time Код: plaintext 1. 2. 3. В случае с темплейтами - оно в compile-time выдаст ошибку, что и нужно.Ты не просто стреляешь себе в ногу, ты ее еще при этом обливаешь горящим бензином и смачиваешь кислотой. Не я где-то наверное могу понять что против идиотского кода хотелось бы иметь защиту, но уж доводить до абсурда то зачем? Ты что не знаешь где у тебя статический массив в программе, где динамический а где класс? Ну тогда да, тогда тебе действительно надо запретить пользоваться sizeof(). Anatoly MoskovskyС какого перепугу в цикле unsigned int предпочтительнее чем size_t? size_t - специально предназначен для индексов, размеров массивов и т.д. А unsigned int не на всех платформах даже может вместить размер объекта в памяти.Если uint меньше чем size_t то ты прав. А если наоборот - то не прав :) Адресное пространство может быть меньше чем вместимость регистра. И хотя таких платформ сейчас не очень много, но... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:21 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли uint меньше чем size_t то ты прав. А если наоборот - то не прав :) Адресное пространство может быть меньше чем вместимость регистра. И хотя таких платформ сейчас не очень много, но... Причем тут размер регистров. По стандарту гарантируется что size_t вмещает любой адрес на данной платформе. А для int вообще по сути никаких гарантий не предоставляется кроме того, что он не меньше чем short. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:36 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlCompile-time Код: plaintext 1. 2. 3. А почему это "неверно"? Что просил, то и получил. Не надо работать с указателями как со статическими массивами и все. Compile-time Код: plaintext 1. 2. 3. В случае с темплейтами - оно в compile-time выдаст ошибку, что и нужно.Ты не просто стреляешь себе в ногу, ты ее еще при этом обливаешь горящим бензином и смачиваешь кислотой. Не я где-то наверное могу понять что против идиотского кода хотелось бы иметь защиту, но уж доводить до абсурда то зачем? Ты что не знаешь где у тебя статический массив в программе, где динамический а где класс? Ну тогда да, тогда тебе действительно надо запретить пользоваться sizeof(). Может это удивительно, но я пишу код не только для себя. И мой код могут легко читать и править другие люди. Считаете никогда не может возникнуть необходимость изменить статический массив на динамический или на вектор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:10 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlЕсли uint меньше чем size_t то ты прав. А если наоборот - то не прав :) Адресное пространство может быть меньше чем вместимость регистра. И хотя таких платформ сейчас не очень много, но... Причем тут размер регистров. По стандарту гарантируется что size_t вмещает любой адрес на данной платформе. А для int вообще по сути никаких гарантий не предоставляется кроме того, что он не меньше чем short.Ну и? Сам же уже ответил на вопрос. Повторяю: размер адреса не обязан совпадать с размером регистра. Считать одним целым регистром быстрее чем половинкой или двумя регистрами, верно? Поэтому использовать тип данных близкий к размеру регистра в качестве счетчиков лучше чем тип данных совпадающий с размером адреса. Compile-timeСчитаете никогда не может возникнуть необходимость изменить статический массив на динамический или на вектор? В моей практике такого не случалось. Статические массивы это очень редкие зверьки с очень ограниченной областью применения. Обычно они живут в пределах одного модуля или даже одной функции и отследить все случаи использования не представляет никакого труда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 06:33 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
White OwlПовторяю: размер адреса не обязан совпадать с размером регистра. Считать одним целым регистром быстрее чем половинкой или двумя регистрами, верно? Поэтому использовать тип данных близкий к размеру регистра в качестве счетчиков лучше чем тип данных совпадающий с размером адреса. Хорош уже фантазировать. На всех распространенных платформах размер size_t совпадает с размером регистров. И при этом как минимум на одной из самых распространенных - x86_64 - размер int не совпадает ни с регистрами ни с адресами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 08:41 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
2 Anatoly Moskovsky: Anatoly MoskovskyПо стандарту гарантируется что size_t вмещает любой адрес на данной платформе. Разве? Не путаете с intptr_t/uintptr_t? Просто в 16-битных DOS/Windows было: near-указатели -- 16-битные far-указатели -- 32-битные size_t -- 16-битный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 04:20 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Пётр Седовfar-указатели -- 32-битные size_t -- 16-битный Объявление FAR-указателя это нестандартное расширение. Поэтому бессмыслено рассматривать взаимосвязь size_t и FAR-указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 04:57 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
А насчет того intptr_t или size_t пригодны для хранения указателей, то по стандарту это конечно intptr_t. А равенство размеров size_t и intptr_t явно не прописано, но легко выводится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 05:13 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
2 Anatoly Moskovsky: Если при компиляции 16-битной программы указать memory model = large, то все указатели по умолчанию -- far, без всяких нестандартных расширений языка. В такой, вполне себе стандартной, конфигурации: указатели -- 32-битные size_t -- 16-битный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 05:30 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, Ну ок. Осталось теперь найти компилятор, который одновременно предоставляет intptr_t и far указатели проверить вмещает ли intptr_t эти указатели :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 06:45 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
А есть какое-то отличие intptr_t от void *? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 14:44 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
отличие intptr_t от void *А есть какое-то отличие intptr_t от void *? По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void. Но внутри оно необязательно хранится также как и указатель. Хотя на практике они побитово равны :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 15:27 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyотличие intptr_t от void *А есть какое-то отличие intptr_t от void *? По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void. Не совсем понятно тогда зачем он нужен и чем он лучше чем void * и если он может указывать на любые объекты то зачем ещё ввели uintptr_t? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 15:50 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
intptr_t, uintptr_t и void *Не совсем понятно тогда зачем он нужен Затем, что иногда приходится писать грязный код, укладывающий указатели в целые и наоборот. А эти типы - просто переносимый способ выбрать целое, в которое можно безопасно уложить указатель. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2012, 16:10 |
|
||
|
Compile-time способ определения размера статического массива в количестве элементов.
|
|||
|---|---|---|---|
|
#18+
intptr_t, uintptr_t и void *Anatoly Moskovskyпропущено... По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void. Не совсем понятно тогда зачем он нужен и чем он лучше чем void * и если он может указывать на любые объекты то зачем ещё ввели uintptr_t? Dimitry Sibiryakov уже написал зачем, а я приведу конкретный пример. Скажем, есть такая структура: Код: plaintext 1. 2. 3. 4. Из-за выравнивания она занимает 8 байт (на 32-битной платформе). Но эту структуру можно «ужать» с помощью следующего трюка. Экземпляры Node1 должны располагаться в памяти выровнено, обычно на 4 байта. Поэтому младший бит указателя на Node1 всегда равен нулю. Этот бит можно использовать для хранения value. Чтобы сделать это максимально переносимо (= кросс-платформенно), нам как раз и понадобится тип uintptr_t: Код: 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. 27. 28. Такая структура занимает уже 4 байта. Плата за это -- усложнение кода и усложнение отладки (теперь в отладчике просто так не посмотришь значение поля next). У типа uintptr_t есть WinAPI-шный аналог -- UINT_PTR. А зачем ввели ещё знаковый intptr_t (и WinAPI-шный INT_PTR) -- не понимаю, по-моему одного uintptr_t вполне достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 03:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2020592]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
203ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 288ms |
| total: | 599ms |

| 0 / 0 |
