Pull to refresh

Comments 12

Это полезно при передаче больших структур, в целях избежания накладных расходов на копирование. Но подобная запись, не будет работать с rvalue значениями, тоесть в данном случае нельзя будет вызвать так func(5), так как литерал не имеет адреса (это касается и структур, создаваемых в момент выхова функции).


Вам неизвестно это осознанное решение или следствие череды других? Что-то совсем грустно прибегать к шаблонам. И кстати перегрузка метода не спасет разве?
Как я уже писал на оффсайте ведётся обсуждение и есть решение. Проблема больше идеологическая, существует 2 подхода:
  • реализовать неявную шаблонизацию (с возможностью перегрузки)
  • либо оставить только функцию принимающую ref, а вызов реализовать через временную переменную
    func(5);
    // разворачивается в
    {
        auto __tmp_var__ = 5;
        func( __tmp_var__ );
    }
    

Что-то, насколько я помню, immutable — это сплошная боль. Нельзя просто так взять и объявить immutable «переменную». Сам тип данных должен быть иммутабелен, а это заставляет писать мутабельные и иммутабельные типы данных по отдельности. Я ошибаюсь?
Ошибаетесь. Просто накладывает соответствующие ограничения. Если Вы хотите просто передавать экземпляр какой-то своей структуры между потоками, то просто все методы доступа должны быть pure const, а методы изменения по определению не могут вызываться для immutable объекта. В следующей статье будет больше подробностей.
Разве экземпляры структур в D не создаются в TLS?
Может, я что-то путаю, но у меня создалась стойкая ассоциация, что в D все эти shared и immutable только заставляют бороться с компилятором. Это точно было в D2. Но давно. Надо будет попробовать еще раз многопоточный сервис реализовать. И я уже даже знаю, какой. И теперь знаю, куда адресовать вопросы :)
Если Вы хотите передать структуру/класс в другой поток она должна быть либо shared, либо immutable. Соответственно вызоваемые методов либо должны быть константными и чистыми, либо Вы должны обозначить их как shared (и прописать необходимые синхронизации в случае структур) или immutable. Такая система типов по началу может вызывать определённый дискомфорт, но если к ней пригледеться, то многое становится ясным.
Так структура должна быть shared или экземпляр структуры?
Т.е. «shared struct T{....}; T s;» или «struct T{....}; shared T s;»?
А, кажется я понял, зачем модификатор shared в описании типа данных. Я не могу написать
struct T{int a; immutable int b;}
я должен всю структуру вывести из TLS и написать:
shared struct T{int a; immutable int b;}
я постараюсь на эти вопросы ответить в следующей статье)
Спасибо за статью.

Моё имхо: её стоило разделить на несколько, чтобы легче воспринималось, и давать материал опираясь на базу C++ (D позиционируется как его преемник), затем уже говорить об особенностях/дополнениях.
Т.е., объяснить что аналогом c++'ного const char* является const (char)* и дать объяснения почему. Отдельно упомянуть про отличия классов и структур и отдельно говорить о передаче параметров в функции.
Получается что каждый параграф в целом понятен, но почему он находится после предыдущего не ясно — нет гладкости повествования.

Успехов, молодец что пишите про D!
Просто я не ставил целью сравнить D с C++, хотелось осветить именно эти моменты (хотя про указатели упомянуть наверное стоит, завтра добавлю).
Sign up to leave a comment.

Articles