
Andrey
13.09.2017
06:37:26
а указатели обязательно ининтить через null при объявлении?

Maxim
13.09.2017
06:38:45
в D, по-моему, нет

Andrey
13.09.2017
06:39:30
ну я вот тоже поичтал мануалы - вроде как при объявлении переменных их ининтить нулем не нужно. а сегодня наткнулся вот на что: It is always a good practice to assign the pointer NULL to a pointer variable in case you do not have exact address to be assigned. This is done at the time of variable declaration. A pointer that is assigned null is called a null pointer.

Maxim
13.09.2017
06:39:32
компилятор сам должен следить за инициализацией

Google

Andrey
13.09.2017
06:39:38
https://www.tutorialspoint.com/d_programming/d_programming_pointers.htm

Maxim
13.09.2017
06:40:39
предлагаю написать тестовую программу: объявить указатель и посмотреть, будет ли он null)
в D должен быть

Andrey
13.09.2017
06:41:23
(:

NullSanya
13.09.2017
06:41:34
вроде должен

Andrey
13.09.2017
06:44:14
да, пишет, что null
стало быть автор статьи перестраховывается

Maxim
13.09.2017
06:50:30
традиция такая у тех, кто имел дело с Си, потому что там переменные не инициализируются)
лучше перебдеть, чем недобдеть

Andrey
13.09.2017
06:51:01
у меня тоже прямо руки чещутся null вписать везде
(:
как-то надежнее выглядит просто так, со стороны глядя.

qwerty
13.09.2017
06:56:31
в случае с D есть все что надо для того, чтоб null вообще не было в коде

Google

Andrey
13.09.2017
06:57:24
ну в методах же надо порой вставлять

Maxim
13.09.2017
06:57:26
можно пойти дальше, в случае с D есть все для того, чтобы не пользоваться указателями)

Andrey
13.09.2017
06:57:38
а структуры укак же?

qwerty
13.09.2017
06:57:49

NullSanya
13.09.2017
06:58:01

Maxim
13.09.2017
06:58:03
нет что?)

Andrey
13.09.2017
06:58:37
ref для меня лично не сильно очевиден

qwerty
13.09.2017
06:58:39
есть действительно все что надо для того, чтоб не пользоваться указателями

Maxim
13.09.2017
06:58:51
я про это и говорю

Andrey
13.09.2017
06:59:07
я его понимаю пока как алиас для & но наверняка ошибаюсь, глубоко еще не читал

qwerty
13.09.2017
06:59:17

Maxim
13.09.2017
07:00:18

Andrey
13.09.2017
07:02:22
ну а массив структур - тоже без указателей городить?

Maxim
13.09.2017
07:02:37
да

Andrey
13.09.2017
07:02:44
непривычно (:

Maxim
13.09.2017
07:03:11
а где вообще в массив структур можно воткнуть указатель?)

Andrey
13.09.2017
07:05:28
я имею в виду нечто, как в С++, struct a; std::vector <a*> array; array.push_back(new a() );

Maxim
13.09.2017
07:06:20
в D это будет просто a[] arr; arr ~= a();

Dmitry
13.09.2017
09:10:12
Только в примере на С++ это не массив структур, а массив указателей на структуры. В массиве структур они последовательно лежат одна за другой, как в примере на D, а в примере Андрея структуры будут раскиданы по памяти фиг знает как, а в массиве один за другим будут лежать указатели на них. Оба варианта имеют смысл, у каждого свои достоинства и проблемы.

Maxim
13.09.2017
09:12:28
тут еще нужно помнить, что структуры в D создаются на стеке)

Google

Andrey
13.09.2017
09:16:01
имеет ли смысл тогда на D вовсе обходить стороной указатели?

Maxim
13.09.2017
09:18:48
имеет смысл везде обходить указатели
У меня такой вопрос назрел. Никто не поверял, прокатывает ли в D хак, подобный C++, когда помечаешь метод как final, и компилятор перестает искать его в таблице виртуальных методов?

qwerty
13.09.2017
09:24:59
в спецификации такое указано, но я не проверял

Dmitry
13.09.2017
09:25:17
Про final методы: почему ж это хак? Это их назначение, практически, классическая оптимизация.

Andrey
13.09.2017
09:28:49

Maxim
13.09.2017
09:29:36
В D классы и структуры — это разные вещи)

Andrey
13.09.2017
09:29:42
это я заметил (:

Maxim
13.09.2017
09:30:06
ну, собственно, из этого и вытекает ненужность указателей)
вместо хранения массива указателей на структуры можно использовать массив классов)

Maxim
13.09.2017
09:31:26
ну или тех же ссылок на структуры)
или даже самих структур)

Dmitry
13.09.2017
09:32:55
Да, в таких случаях (а они очень часты) достаточно просто классов, там указатели уже убраны под капот.

Maxim
13.09.2017
09:34:56
но тут нас поджидает другой сюрприз: если нам нужен гарантированный деструктор при выходе из области видимости, то придется использовать структуры)

NullSanya
13.09.2017
09:35:22

Andrey
13.09.2017
09:35:33
получается так, что то, что я лепил в С++ внутри класса как class myClass{ classTwo* class2; } можно писать без звезды. и передача в фнукцию, например, тоже пойдет без указателя, а просто, типа, foo(myClass class)

Maxim
13.09.2017
09:35:44

NullSanya
13.09.2017
09:36:06

Google

NullSanya
13.09.2017
09:36:13
Хотя на самом деле структура

Andrey
13.09.2017
09:36:22

Maxim
13.09.2017
09:37:42

Andrey
13.09.2017
09:39:47
да просто я как думаю, по-деревенски, если все равно есть проблемы и тонкости по уборке, то что new/delete в С++ что нюансы с GC - jlby xjhn
один чорт то есть (:

Maxim
13.09.2017
09:40:45
сборка мусора гарантированно позволяет избежать ошибок программиста, связанных с утечкой памяти

Andrey
13.09.2017
09:41:24
ну вот внутри у меня в классе будут С-функции, которые с памятью работаю по-своему. и за ними надо следить.

Maxim
13.09.2017
09:41:27
но за это приходится платить оверхедом сборщика мусора и несколько бОльшим потреблением памяти

Admin
ERROR: S client not available

Andrey
13.09.2017
09:42:14
и потому мои небольшие ожидания, что можно немного расслабиться, идут прахом (:
ну библиотека какая-нибудь, например, SDL2
или allegro5

Maxim
13.09.2017
09:43:06
собственно, обертки над такими делами делаются, со всех сторон обкладываются тестами, и дальше используются именно обертки)
именно для того, чтобы не тянуть C-функции работы с памятью в остальной проект
магии, увы, не существует)

Andrey
13.09.2017
09:44:17
это делается, как правило ,на стороне бинда библиотеки или тем, кто уже использует эти бинды?

Maxim
13.09.2017
09:44:48
да по-разному, я подозреваю)

Andrey
13.09.2017
09:44:53
(:

Google

Andrey
13.09.2017
09:45:38
я так понимаю, если функции сишные в бинде имеют nogc и nothrow то по-любому придется самому суетиться?

Maxim
13.09.2017
09:47:24
nogc и nothrow — это всего лишь подсказки компилятору, что внутри функции не будет операций, которые приводят к сборке мусора и ничто не выкинет исключение
а если в бинде функции сишные, то суетиться в любом случае придется

Andrey
13.09.2017
09:48:13
ну что ж - так тому и быть. спасибо за объяснения.

Dmitry
13.09.2017
10:30:40
У меня вопрос по диапазонам. Есть ли понятие ленивые диапазоны?

Maxim
13.09.2017
10:31:16
они все вроде как ленивые должны быть
по возможности, конечно

NullSanya
13.09.2017
10:31:37
ну если явно их не превратить во что-то
так они ленивые

Dmitry
13.09.2017
10:34:17
а как работает метод .array который преобразует диапазон в простой массив

Maxim
13.09.2017
10:35:01
собирает все в кучу и возвращает массив

Dmitry
13.09.2017
10:35:20
т.е. ему нужно время какое-то получается чтобы там все проитерировалось внутри?

Maxim
13.09.2017
10:36:01
ага
а если у диапазона нет конца, будет ой
и если быть точным, .array — это не метод, а шаблон, объявленный в std.array, который для любого Range возвращает динамический массив типа ForeachType!Range[]
внутри он работает как appender

Dmitry
13.09.2017
10:55:46
Олег https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2017/09/websight.gif

Andrey
13.09.2017
11:11:43
ссылки есть только в параметрах функций

Andrey
13.09.2017
11:20:26
вот еще вопрос по наследованию. есть родительский класс со свойством int a; чтобы это свойство увидеть в наследнике, надо обязательно в родительском оформить,например, @property int a(){} ?

Andrey
13.09.2017
11:22:12
просто используй а
оно видно в наследнике если оно public и protected

Andrey
13.09.2017
11:23:05
а. у меня private, потому и не дает, наверное
понятно