Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38071191&tid=2020592]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
182ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 291ms |

| 0 / 0 |
