LINUX.ORG.RU

Указатели в С и вообще

 ,


2

5

В чем принципиальная необходимость использования указателей? Почему нельзя обращаться к переменной в динамической памяти по ее имени, а не по адресу?

Для меня единственный пример, когда использование указателей естественно и неизбежно - это динамические структуры данных. Связанный список в принципе без указателей не сделать.

Это действительно так, С переиспользует указатели, там где без них можно было бы обойтись? Или есть какие-то детали работы с памятью, которые я упускаю?

★★★★
Ответ на: O_O от Deleted

хинт: я работаю архитектором Сбербанка. Более подсказать не могу по NDA, сам всё додумаешь :)
stevejobs ★★★★★ (25.11.2016 14:48:44)

evilface ★★
()
Ответ на: комментарий от stevejobs

на самом деле можно это оптимизировать. Обычно метод выполняется с XML/JSON примерно одинаковой структуры. Эту структуру можно считать „анонимным временным типом“. Когда выполняется первый вызов метода, профилировщик изменяет AST так, что вместо вызова универсальной функции там проставляется этот „временный тип“, и адреса на „переменные“ все кэшируются. При последующих запросах проверяется (не спрашивай как), не изменилась ли структура, и дальше используются кэшированные значения. Это сильно всё ускоряет. Надо на Швабр запилить статью об этой оптимизации.

По всей видимости, ты изобретаешь частный случай трассирующей JIT-компиляции.

Deleted
()
Ответ на: комментарий от Deleted

да, только не изобретаю (слишком туп для этого), а честно заимствую уже хорошо работающее из Graal & Truffle и соответствующих статей в научные журналы от компиляторщиков :) Например, почитай статью «Self-Optimizing AST Interpreters» от Thomas Wurthinger, там описано человеческим высокоуровневым языком

очень важно что в описанном выше оптимизация не трассирующая. Т.е. деоптимизация происходит именно в момент нарушения предположений при вызове метода, и происходит локально, не требуя информации от всей трассы, не требуя глобального наблюдателя

блин, зачем я это пишу здесь :3

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 3)
Ответ на: комментарий от stevejobs

Сишка не динамическая, не умеет в горячую подгрузку кода, неоткуда взяться функциям с неопределенным числом именованых параметров.

Чушь какую-то несешь! Нет ни одного ЯП, на котором нельзя было бы сделать то же самое, что можно сделать на С.

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

И всякие дебильные перегрузки функций из цепепе в С тоже элементарно решаются тем же самым способом: для каждого типа аргумента пишется своя функция, и на макросах вполне можно эту перегрузку устроить.

anonymous
()
Ответ на: комментарий от anonymous

Нет ни одного ЯП, на котором нельзя было бы сделать то же самое, что можно сделать на С.

Вот в Jave официально нет указателей. И как сделать аналог *(a+2) в ней?

hotpil ★★★★
() автор топика
Ответ на: комментарий от hotpil

Вот в Jave официально нет указателей

Чем reference types от них отличаются?

tailgunner ★★★★★
()
Ответ на: комментарий от stevejobs

Сишка не динамическая, не умеет в горячую подгрузку кода, неоткуда взяться функциям с неопределенным числом именованых параметров.

Что мешает помещать на стек произвольное количество параметров? Смотри, как устроен printf. Написать пару условий, чтобы в printf передавать разное кол-во параметров — дело нехитрое.

iVS ★★★★★
()

Раз уже поднялась эта тема вообще, для ясности предмета - присылайте годную документацию по указателям C.

anonymous
()
Ответ на: комментарий от tailgunner

Это было бы досадным враньем, для успеха вполне достаточно упарываться (джавой)

stevejobs ★★★★☆
()
Ответ на: комментарий от iVS

int printf ( const char * format, ... );

variable arguments это по сути один аргумент - массив с элементами одинакового размера

а теперь внимательно читай на что ответил ;)

с неопределенным числом именованых параметров.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

с неопределенным числом именованных параметров

Да элементарно: передавай указатель на строку, в которой и будут твои именованные параметры. Как это во всяких быдлоЯПах делается.

anonymous
()
Ответ на: комментарий от anonymous

Нотки настоящего покорителя монады io слышатся в голосе! Ну так что мелочиться, засунь в строку прямо код на ruby, в начале метода передавай в руби (хотя бы через execl, а лучше подключить руби как dll). Настоящее программирование на Си, да?

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Ты не съезжай в сторону!

Я еще раз повторяю: на С можно сделать абсолютно все, что можно сделать на других ЯП.

Так на кой хрен учить другие ЯП?

anonymous
()
Ответ на: комментарий от stevejobs

variable arguments это по сути один аргумент - массив с элементами одинакового размера

Нет, массив в сишке — это непрерывный блок памяти. Аргументы к printf кладутся на стек (для 32 бит): первый — это указатель на строку, остальные могут быть просто числами, могут быть указателями. printf распарсит первый аргумент и дальше возьмет со стека, что нужно.

iVS ★★★★★
()
Ответ на: комментарий от stevejobs

Блин, объясни, наконец, что ты подразумеваешь под «сослаться на параметр по имени»?

Я понял, что думал совсем о другом!

anonymous
()
Ответ на: комментарий от stevejobs

Сорри, тут мы чуть-чуть о разном. Мне следующее высказывание не понравилось:

На этапе компиляции компилятор тебе уже может весь memory layout нарисовать хоть в картинках.

Откуда весь memory layout возьмется, когда число аргументов функции не фиксировано?

iVS ★★★★★
()

Или есть какие-то детали работы с памятью, которые я упускаю?

Да. Указатели тоже имена имеют. Т.е., собственно, обращение по указателю — это и есть обращение по имени.

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

anonymous
()
Ответ на: комментарий от iVS

да, ты прав.
(в свое оправдание - стараюсь никогда таким ужасом не пользоваться)

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

зачем тебе экскаватор? бери лопату и копай фундамент для многоэтажного дома. всё что можно сделать экскаватором можно сделать лопатой или палкой-копалкой. экскаваторы нинужны - сплошное наеово, стоят много, шумят и бензин жрут.

anonymous
()
Ответ на: комментарий от anonymous

Ну, давай, приведи мне пример экскаватора в ЯП, который сишку за пояс заткнет!

С++? Сильно сомневаюсь в значительном приросте производительности труда программиста...

А больше реальных ЯП я и не знаю, только говно одно вроде пхытонов-перлов на ум приходит. Но на них только идиот что-нибудь серьезное делать будет. Это как большой член: прикольно, но практической пользы нет.

anonymous
()
Ответ на: комментарий от stevejobs

Ты можешь на них сослаться по имени?

lol = va_arg(ap, int); не считается?

deadskif
()
Ответ на: комментарий от tailgunner

Уже много лет прошло, а мне так никто и не сумел доказать, что цепепе и пхытон — достойные ЯП. Так что, я и далее считаю их парашей.

anonymous
()
Ответ на: комментарий от anonymous

Уже много лет прошло

...а ты до сих пор не знаешь, что Си, Си++ и Python мир языков программирования не исчерпывается.

а мне так никто и не сумел доказать

Да кому нужно тратить на тебя силы...

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Все, что мне нужно, я пишу на сях. Иногда приходится для веб-морд паскудный жабоскрипт использовать. Все, диапазон ЯП, в которых я вижу необходимость, исчерпан!

А, нет, забыл: изредка приходится дизассемблер посмотреть, чтобы проверить, что там компилятор для МК «понаоптимизировал».

Да кому нужно тратить на тебя силы...

Да насрать мне на них. И на тебя.

anonymous
()
Ответ на: комментарий от anonymous

Да кому нужно тратить на тебя силы...

Да насрать мне на них. И на тебя.

На всех, кто не хочет тратить на тебя силы? Должно быть, в тебе ОЧЕНЬ много кала %)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

в значительном приросте производительности труда программиста

net_kernel:connect_node('m1@some-remote.com'),
{_, Obj, Fn} = code:get_object_code(SomeModule),
rpc:call('m1@some-remote.com', code, load_binary, [SomeModule, Fn, Obj]),
rpc:call('m1@some-remote.com', SomeModule, naverny_govna_eddi, [])

покажи аналог на ansi c)

А больше реальных ЯП я и не знаю,

хехе) я мужики то и не знали)

anonymous
()
Ответ на: комментарий от tailgunner

В C++ не называют указатели ссылками.

anonymous
()
Ответ на: комментарий от anonymous

покажи аналог на ansi c)

Показываю:

connect_node(net_kernel, "m1@some-remote.com");
obj = get_object_code(code, SomeModule);
rpc_call("m1@some-remote.com", code, load_binary, modstr);
rpc_call("m1@some-remote.com", SomeModule, naverny_govna_mudak, NULL);

anonymous
()
Ответ на: комментарий от hotpil

Где он храниться? В стеке.

Не обязательно

anonymous
()
Ответ на: комментарий от utf8nowhere

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.