Pull to refresh

Comments 19

В С++ мы избегаем вызова sizeof так как размер типа вычисляется компилятором автоматически

Што, вызов sizeof?..

Смысл new в С++ не просто в выделении памяти, а вызове конструктора и начале лайфтайма объекта, в С это бессмысленно, так что получилось сделать свой код несовместимым с С++ ))

 получилось сделать свой код несовместимым с С++ ))

Но ведь главной целью не было сделать код совместимым с С++. Главной целью было повторить синтаксически и максимально похоже оператор new в С, с чем я считаю справился ( за исключением скобок ) - но это уже не критично.

Не боитесь, что не сейчас, но когда-нибудь потом, за

#define new(t,...)

кто-нибудь захочет вас убить ? Возможно даже вы сами )

Ну я не считаю что макросы с переменным количеством аргументов плохи, если вы это имели ввиду. Я считаю что если такая возможность языка имеется, и её можно применить, то её нужно применить. А что плохого вы видите в их использовании? Было бы интересно послушать о минусах/подводных камнях/недостатках и неудобства их использования, да и другим будет полезно

Не в количестве переменных дело, а в дефайне new. А если хедер с этим окажется когда-нибудь включенным в плюсовый код, то редефайне. Вот радости-то будет.

Вы добавили очень сомнительной полезности сахар и положили рядом граблю

Ух это да. Но я думаю вряд-ли такое останется без внимания - компилятор сгенерирует столько ошибок, сколько было написано new, и тогда злополучная строка быстро обнаружится.

Вы добавили очень сомнительной полезности сахар и положили рядом граблю

Насчёт полезности честно не знаю - вкусовщина. Кому-то тип легче написать, а кому-то sizeof подтянуть. Всё ради эксперимента

Кстати такая же неприятность может случиться вот с таким макросом:

#define for(...)

Проблем доставит ещё больше чем дефайн new.

От включения заголовочника в код на C++ можно защититься:
#ifndef __cplusplus
// #define new, etc
#endif

Но с остальными Вашими доводами вполне согласен

Придумать оператор new, который похож на new из С++, но немного другой - можно. Но зачем???

Я ожидал увидеть самодельный аллокатор, а не вот это.

Хм интересно. Может напишу об этом статью потом. Но здесь задумкой было повторить его синтаксически, а не технически.

Но зачем? Неужели экономия букв исходников стоит того, чтобы превращать его в шараду?

new(20);
new(int);
new(20,int);
new(int,20);
  

КМК, лучше честный calloc+sizeof.

Конечно лучше, никто не спорит. Следует использовать инструменты которые присутствуют в языке. Я просто экспериментировал :)

немного неудобно организована работа с памятью

Да она вообще неправильно организована от слова совсем.
Например вы не можете контролировать выделение/освобождение/выравнивание/учет памяти, не можете поменять метод выделения и ограничения на количество, даже просто определить сколько выделено и кем вы не можете. Не говоря уже о том что бы автоматически освобождать ресурсы которые понавыделял остановленный поток или подпрограмма и вообще сколько и она дочерних потоков запустила при жизни. Не говоря о передачи способа выделения памяти в подпрограмму.
И в свете лютой многопоточности и многоступенчатого механизма кэшей каждый поток может хотеть иметь собственный пул память с разной иерархией скорости доступа. И в таких ситуациях вы вынуждены будете использовать кастомные аллокаторы и все эти эргономичные ухищрения c #define new вам не понадобятся, тем более что такой метод способен сломать больше чем кажется.

ps: В C++ есть RAII и предлагается что все ресурсы программа которая их выделила, сама их и освободит. Но можно в C ничего подобного нет и не надо соблюдать эту условность. т.е. можно сделать «завещание» которое можно использовать для освобождения ресурсов при внезапной смерти потока/функции/fsm. Более того такой способ позволит ограничивать время исполнения кода, т.к. это такой же ресурс как и память например.

"Скальпель вообще неправильный инструмент, им можно сильно порезать ногу, руку, голову... Его опасно носить без чехла в кармане... Можно случайно наступить на него и порезать ногу... Копать им неудобно, пилить брус долго, медведя не убьёшь, чешую с рыбы чистить сложно..."

Тут как раз не скальпель, а каменный топор

Некорректное утверждение, malloc более тонкий инструмент, который используется в реализации new, можете поизучать libstdc++.

Если честно, открывая статью, ожидал увидеть использование _Generic. А такое вот, ну не знаю даже, согласен с остальными, против макроса возражений нет, возражения нет что он мимикрирует под С++, имея другое поведение.

Кажется, malloc(n * sizeof(int)) выглядит лучше, чем malloc(n, int). Прозрачнее и идиоматичнее, фактически на русском языке написано, что происходит, это почти что реализация именованных параметров в языке без их поддержки :). При этом sizeof - это не вызов функции, и умножение тоже не будет в рантайме производиться (если n - константа).

Слава богу в этот раз бред этого студента заминусовали.

  1. А что не так?

  2. Вы же понимайте что комментарии подобного рода автору вообще ничего не говорят о его ошибках?

Sign up to leave a comment.

Articles