
Grigirii
18.01.2017
17:04:37
низкий приоритет задачи это раз. всё, что используется из рантайма придётся статически влинковать - два. сейчас можно собрать действительно маленкий исполняемый файл, требующий С-рантайм, который и так везде есть. Если использовать свой, то его нет нигде и таскать надо будет
ещё важно взаимодействие с другими либами и удобно находится под одним рантаймом, когда одна либа может пользоваться объектами другой
я сейчас на С++ в одном приложении вынужден использовать dll-ки с разными рантаймами (студия и мингв) и это ад. stl объекты передавать нельзя, освобождать память выделенную другой дллкой нельзя, общение почти на уровне extern "C" __stdcall
го закрылся в своей инфраструктуре и общение с С имром там не очень развито. оно было, но его стараются избегать. и уж точно рядовые программисты не используют С и го в одном проекте

Google

Dmitry
18.01.2017
17:44:25
"что используется из рантайма придётся статически влинковать" а можно пример?
В Go как я понимаю свой рантайм привел к статической линковке всего, но дал и побочку в виде — софт на go компилится и работает везде без зависимостей так?
Grigirii я правильно понимаю что весь Си-рантайм вынесен в одну библиотеку? msvcr120.dll
Я просто раньше думал, что он как-то в каждый бинарик вшивается компилятором, а тут оказалось, что некоторому софту либа нужна msvcr120.dll в которой по идее этот рантайм, но почему именно в этой либе? Там только он что ли? И больше его не откуда импортировать или какая ситуация?

Grigirii
18.01.2017
17:52:42
так как стандартная библиотека С полностью доступна из дишной std.c.* очень странно реализовывать её ещё раз

Dmitry
18.01.2017
17:55:24
а от чего зависит какая часть влинковывается, а какая нет? Можно сделать чтобы все влинковывалось?

Grigirii
18.01.2017
17:57:11
можно, гугли static linck c runtime

Dmitry
18.01.2017
18:03:03
Так, а msvcr120.dll она же динамическая либа, с ней статически линковаться нельзя, получается мне ее lib аналог нужен верно?

Grigirii
18.01.2017
18:03:43
теоретически ничего не мешает стстически линковаться с dll
я под виндой этого никогда сам не делал, поэтому могу только на уровне гугла советовать

Dmitry
18.01.2017
18:04:35
мне вроде говорили что с dll принципиально невозможно линковаться т.к. в ней чего-то там нет...

Grigirii
18.01.2017
18:05:13
да вроде всё есть, в dllMain даже приходит инфа о том, статически или динамически её ликовали

Google

Dmitry
18.01.2017
18:05:46
так погоди, а от чего зависит что влинковывается, а что нет?

Grigirii
18.01.2017
18:06:02
чаще вместо статической линковки распространяют dll вместе с exe
https://social.msdn.microsoft.com/Forums/vstudio/en-US/ab187afb-3af0-44ba-a03c-dde9e5208a1a/static-link-to-vc-runtime?forum=vclanguage
но всё же я бы не стал так извращаться, а положил файлик dll рядом с exe. либо вложил в инсталятор redistributable pack

Dmitry
18.01.2017
18:10:16
так а чем один Си-рантайм от другого отличается? как я понимаю их дофига

Grigirii
18.01.2017
18:12:39
внешне ничем или почти ничем. их не дофига, их для винды всего два: студия и mingw. у обоих конечно есть версии, но не более. Есть конечно другие, но это экзотика
под линухом так вообще есть один системный и все пользуются им. там свои заморочки с версиями, но можно полагаться на то, что в системе есть


Dmitry
19.01.2017
07:01:21
О, я правильно понимаю, что в Ди добавили то о чем мы говорили выше?
http://dlang.org/changelog/2.073.0.html#mscrtlib-option
>option specifies the reference to the C runtime library libname that is embedded into the object file
Не могу найти, как в ди по стандарту должны записываться экземпляры классов?
Почему при генерации документации нужно передавать ключ -c ? -c do not link
Появилась инструкция как собирать приложения для Android на Windows
https://wiki.dlang.org/Build_Android_Apps_using_LDC_in_a_Container
Изменение строки же у нас происходит через аллоцирование. Почему следующий код показывает одинаковы адреса переменных:
string str = "big";
writeln(&str);
str.replace("i","a");
writeln(&str);
—-
> app.exe
19FE10
19FE10

0x9d8e
20.01.2017
12:31:07
Может быть потому, что после str было свободное место и не пришлось аллоцировать эту память где-то в другом месте?

Dmitry
20.01.2017
12:31:25
ну я вот тоже про это думал. Но как проверить чтобы наверняка?

0x9d8e
20.01.2017
12:32:01
Попробуй сразу после string str = "big" ещё одну переменную объявить, желательно тоже строковую
и сделать реплейс не "а", а "text text text text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text"

Dmitry
20.01.2017
12:32:55
обяъвил переменную — та же фигня

0x9d8e
20.01.2017
12:33:09
чтобы в первоначально выделенную память не влезло

Google

Dmitry
20.01.2017
12:33:39
старинца памяти же вроде 4 кб, так сто строку нужно больше 4KB сделать верно?

0x9d8e
20.01.2017
12:33:42
а то там выделено, условно, 3 байта, оно в эти 3 байта влазит, вот туда и переаллоцируется
видимо да
это, кстати, очень даже замечательно, что оно так происходит
попробуй сначала просто на пару байт увеличить
интересно даже что будет

Dmitry
20.01.2017
12:36:42
щас момент попробую 4 RB и один байт серху сделать
точнее для начала ровно 4KB

0x9d8e
20.01.2017
12:37:44
блин
а это же константы
компилятор заранее знает их длину
вот и оптимизирует так

0x9d8e
20.01.2017
12:38:28
а что если их через stdin получать?

Dmitry
20.01.2017
12:39:47
тоже самое

0x9d8e
20.01.2017
12:40:58
а если на 9 строке?
просто если мы заменяем 1 символ на 1 символ длина точно не меняется (и компилятор это знает) и ничего переаллоцировать точно не надо

Dmitry
20.01.2017
12:42:48
замена без аллокации?

Grigirii
20.01.2017
12:43:18
а при чём здесь компилятор? это в рантайме определится, надо ли делать перевыделение. более того, если сделать realloc, то указатель может не поменяться даже в случае довыделения памяти
в чём изначальный вопрос? зачем нужно знание о изменении или неизменении указателя?

Google

0x9d8e
20.01.2017
12:43:41
интересно есть ли там какая логика в рантайме в том случае, если у компилятора нет возможности предполагать, что переаллоцировать не потребуется и нет возможности заранее узнать сколько может потребоваться памяти
мне кажется в первом примере можно и без рантайма
а вот чтобы при переаллокации указатель изменился нужно чтобы пришлось это дело перенести в другое место

Grigirii
20.01.2017
12:45:30
можно, но чтобы делать подобные вещи это должен быть полностью известный компилятору алгоритм и он должен уметь оптимизировать этот частный случай. даже мощные gcc и clang такое не делают

0x9d8e
20.01.2017
12:45:38
D же строки хранит как непрерывную последовательность? Или как связный список таковых?
хм
ну repace('i', 'a') как-то очень легко в этом плане оптимизировать
когда там константы

Grigirii
20.01.2017
12:47:45

0x9d8e
20.01.2017
12:51:42
ну тогда str.replace('i', stdin.readIn()) должен бы переаллоцировать, если много, а после что-то уже есть, то на другое место

Admin
ERROR: S client not available

0x9d8e
20.01.2017
12:51:50
иначе как вообще

Grigirii
20.01.2017
12:53:58
https://github.com/dlang/phobos/blob/master/std/array.d#L1962

Alexander
20.01.2017
12:54:00
Как я понял, строка это указатель на некую структуру в памяти. Поэтому при изменении этой структуры указатель на нее не меняется

Grigirii
20.01.2017
12:54:09
вся реализация

Alexander
20.01.2017
12:54:50
Попробуй объявит две строки одну за другой и сравни указатели на них

Grigirii
20.01.2017
12:55:55
блин, точною тестовый код - полная фигня
&str всегда будет одним и тем же, это же указатель на локальную переменную
чтобы взять указатель на данные строки надо str.ptr
строки не ссылочные типы, это структуры из двух указателей - начало и конец. поэтому они могут ссылаться на одну и ту же строку, но при этом быть разными объектами и ни is ни & не поможет это определить. только str.ptr

Google

Dmitry
20.01.2017
13:08:39
а & это ссылка получается? На что она ссылается?

Grigirii
20.01.2017
13:11:01
это укзатель на локальную переменную. на конкретно эту переменную объявленную на стеке
и он станет невалидным сразу на выходе из функции, потому что это стековая переменная
а вот контент строки может продолжить жить

Dmitry
20.01.2017
13:12:21
попоробовал:
тот же эффект

0x9d8e
20.01.2017
13:13:45
str.replace('i', 'asdfgh');

Grigirii
20.01.2017
13:13:55
не скомпилится

0x9d8e
20.01.2017
13:14:13
Почему?

Grigirii
20.01.2017
13:14:52
http://dlang.org/phobos/std_array.html#.replace
возвращает новый объект
это во-первых
'asdfgh' невалиден, только "asdfgh"

Dmitry
20.01.2017
13:15:15
сновf один и тот же адрес...

0x9d8e
20.01.2017
13:15:39
ссаные кавычки

Grigirii
20.01.2017
13:15:58

Dmitry
20.01.2017
13:16:15
string str = "big";
writeln(str.ptr);
str.replace("i","aqqq");
writeln(str.ptr);

Grigirii
20.01.2017
13:16:46
это понятно, но
ttp://dlang.org/phobos/std_array.html#.replace
возвращает новый объект

0x9d8e
20.01.2017
13:16:52
точняк)

Grigirii
20.01.2017
13:16:56
то есть только str= str.replace
иначе эта функция вообще ничего не делает

0x9d8e
20.01.2017
13:17:22
я то думал он заменяет сей объект новым

Grigirii
20.01.2017
13:17:22
для изменения этого же объекта есть http://dlang.org/phobos/std_array.html#.replaceInto