powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Язык D как альтернатива C++0x
25 сообщений из 166, страница 6 из 7
Язык D как альтернатива C++0x
    #37046292
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravAnatoly MoskovskyВ данном случае вполне можно хранить свой кеш в каждом потоке (через TLS) - тогда не нужна блокировка.
К сожалению использование TLS тут имеет ряд проблем.
Понятно что есть проблемы. Но всегда можно найти компромис. Ведь речь идет об оптимизации. Значит чем-то нужно будет пожертвовать, т.к. ничего даром не дается.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37046294
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНа шаблон С++ я бы посмотрел.
В качестве зарядки с утра сделал :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
// Simple no-op cache
template <class R>
struct cache {
    cache(int size) 
    {
    }
    // 1 arg
    template <class  A1>
    boost::optional<R> get(A1 a1)
    {
        return boost::optional<R>(); // not implemented
    }
    template <class  A1>
    void set(A1 a1, R value)
    {
        // not implemented
    }
    // 2 args
    template <class  A1, class A2>
    boost::optional<R> get(A1 a1, A2 a2)
    {
        return boost::optional<R>(); // not implemented
    }
    template <class  A1, class A2>
    void set(A1 a1, A2 a2, R value)
    {
        // not implemented
    }
    // ... n args
};

// Caching function object
template <class R, class F>
struct memoizer {
    typedef R result_type;
    cache<result_type> m_cache;
    F m_func;
    memoizer(int cache_size, F func): m_cache(cache_size), m_func(func) {}
    // 1 arg
    template <class A1> result_type operator() (A1 a1)
    {
        boost::optional<result_type> res = m_cache.get(a1);
        if (!res) {
            res = m_func(a1);
            m_cache.set(a1, res.get());
        }
        return res.get();
    }
    // 2 args
    template <class A1, class A2> result_type operator() (A1 a1, A2 a2)
    {
        boost::optional<result_type> res = m_cache.get(a1, a2);
        if (!res) {
            res = m_func(a1, a2);
            m_cache.set(a1, a2, res.get());
        }
        return res.get();
    }
    // ... n args
};

// Function object generators:
// ptr fun overloads
template <class R, class A1>
memoizer<R, boost::function<R (A1)> > memoize(int cache_size, R func(A1)) 
{
    return memoizer<R,boost::function<R (A1)> >(cache_size, boost::bind(func, _1));
}
template <class R, class A1, class A2>
memoizer<R, boost::function<R (A1, A2)> > memoize(int cache_size, R func(A1, A2)) 
{
    return memoizer<R,boost::function<R (A1, A2)> >(cache_size, boost::bind(func, _1, _2));
}
// ...
// mem fun overloads 
// ...


// Usage:
int fact(int n)
{
    int f =  1 ;
    while (n >  1 ) {
        f *= n --;
    }
    return f;
}

int gcd(int a, int b)
{
    if (b ==  0 )
        return a;
    return gcd(b, a % b);
}

int main(int argc, char* argv[])
{
    boost::function<int (int)> fast_fact = memoize( 10 , fact);
    cout << fast_fact( 10 ) << endl;
    boost::function<int (int, int)> fast_gcd = memoize( 10 , gcd);
    cout << fast_gcd( 10 ,  15 ) << endl;
	return  0 ;
}

...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37046934
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravSiemarglpetrav, где теряем? На D сделано через шаблоны.
Причем была возможность сделать их pure, но потеряли бы в удобстве.

На шаблон С++ я бы посмотрел.
Фишка в том, что это со многими другими фичами (Pipes, interpocess, unittest) попадает в stdlib.
Я код D не очень понял, если честно.

Но в С++ коде данные кешируются в нескольких static переменных. Что будет если такую функцию вызывать из нескольких потоков?
А если добавить туда мьютекс - так его блокировка тоже не мгновенный процесс.
Достаточно блочить только конец кэша при его добавлении. Остальное реентерабельности не помеха.

Anatoly Moskovsky,
идею как сделано понял, но это не отменяет того, что буст-это супер-мега костыли )
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047175
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglбуст-это супер-мега костыли )
Ну на самом деле очень большой плюс буста, что он изолирует эти все костыли от програмиста, взамен давая удобные и простые в использовании фичи, изначально не предусмотренные при проектировании языка.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047232
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, не возражаю против достоинств (хотя сам выбрал попроще и полегче либу d-lib).
Но иногда цена высокая: Оптимизирующие компиляторы

Я тут пересобрал себе буст под MinGW 4.5 - перепроверил результат. Из-за какой то фигни с бустом и оптимизатором VC9 проигрывает ему в 10 раз =( Перемудрили где-то
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047300
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovsky, не возражаю против достоинств (хотя сам выбрал попроще и полегче либу d-lib).
Но иногда цена высокая: Оптимизирующие компиляторы

Я тут пересобрал себе буст под MinGW 4.5 - перепроверил результат. Из-за какой то фигни с бустом и оптимизатором VC9 проигрывает ему в 10 раз =( Перемудрили где-то
Тут не обязательно проблема в Бусте.
Например в том коде по ссылке что вы привели - работа с регексами.
А как выяснилось в GCC используется реализация строк с COW, а в VS - нет.
Естественно что при активной работе со строками это существенно влияет на производительность.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047348
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Не думаю, что дело в этом. В D - строки строго иммутабельные, а скорость близка к GCC.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047376
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglВ D - строки строго иммутабельные, а скорость близка к GCC.
Не вижу противоречия.
Если нет модификаций in-place, то строки COW имеют такую же производительность как и immutable (и там и там копируется только ссылка, а не тело строки)
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047415
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА как выяснилось в GCC используется реализация строк с COW, а в VS - нет.
Естественно что при активной работе со строками это существенно влияет на производительность.
Не верится. Нет исходников проверить, но в MSDN написано
MSDNReferences, pointers, and iterators that designate elements of the controlled sequence can become invalid after any call to a function that alters the controlled sequence, or after the first call to a non-const member function.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047451
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly MoskovskyА как выяснилось в GCC используется реализация строк с COW, а в VS - нет.
Естественно что при активной работе со строками это существенно влияет на производительность.
Не верится. Нет исходников проверить, но в MSDN написано
MSDNReferences, pointers, and iterators that designate elements of the controlled sequence can become invalid after any call to a function that alters the controlled sequence, or after the first call to a non-const member function.
Во что не верится? Что в VS нет COW в строках?
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047709
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovsky,

Не думаю, что дело в этом. В D - строки строго иммутабельные, а скорость близка к GCC.
Извините, а чем COW отличается от иммутабельности ?
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047786
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySiemarglпропущено...

Не верится. Нет исходников проверить, но в MSDN написано
пропущено...

Во что не верится? Что в VS нет COW в строках?
Ну да. Судя по всему - типичная реализация со счетчиком ссылок. Я еще на обсуждение на RSDN наткнулся, что это так.


petrav>Извините, а чем COW отличается от иммутабельности ?

Это разные несвязанные концепции. Иммутабельность - это наследуемый const. Соответственно, если строка иммутабельна, то поменять можно только через COW или аналог.
Хотя надо иметь в виду, что есть разница:
1. immutable (char)[] str; // тут строку, т.е указателю можно присвоить другой массив или расширить этот, но содержимое менять низзя. Это строки D2
2. immutable (char[] str) // тут строку переприсвоить нельзя, а содержимое изменяемое
3. immutable (char[]) str; // как 1, но расширить массив тоже нельзя

Из-за наследуемости компилятору легче оптимизировать иммутабельные вещи. Они же легко разделяются между потоками.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047789
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravSiemarglНе думаю, что дело в этом. В D - строки строго иммутабельные, а скорость близка к GCC.
Извините, а чем COW отличается от иммутабельности ?
Буквочкой W :)
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047805
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovskyпропущено...

Во что не верится? Что в VS нет COW в строках?
Ну да. Судя по всему - типичная реализация со счетчиком ссылок. Я еще на обсуждение на RSDN наткнулся, что это так.
А вы запустите студию. Скопируйте одну строку в другую и на содержимое объектов - в отладчике. Там разные указатели будут.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047808
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglpetrav>Извините, а чем COW отличается от иммутабельности ?

Это разные несвязанные концепции. Иммутабельность - это наследуемый const. Соответственно, если строка иммутабельна, то поменять можно только через COW или аналог.
Хотя надо иметь в виду, что есть разница:
1. immutable (char)[] str; // тут строку, т.е указателю можно присвоить другой массив или расширить этот, но содержимое менять низзя. Это строки D2
2. immutable (char[] str) // тут строку переприсвоить нельзя, а содержимое изменяемое
3. immutable (char[]) str; // как 1, но расширить массив тоже нельзя

Из-за наследуемости компилятору легче оптимизировать иммутабельные вещи. Они же легко разделяются между потоками.
Ничего не понял, если честно. Какой-то ад по моему. То строку можно перезаписать, то только расширить. Как так можно программировать не представляю.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047811
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovskyпропущено...

Во что не верится? Что в VS нет COW в строках?
Ну да. Судя по всему - типичная реализация со счетчиком ссылок. Я еще на обсуждение на RSDN наткнулся, что это так.

Если взять конкретно VS2008, то я допускаю что возможно там некий счетчик и есть (не проверял).
Но копирование там точно есть и это легко проверить не заглядывая в исходник STL.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int main()
{
    string a = "test";
    string b = a;
    cout << (void*)a.c_str() << endl;
    cout << (void*)b.c_str() << endl;
    return  0 ;
}
В GCC этот код печатает два одинаковых указателя, в VS2008 - два разных.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37047991
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, проверил. В VS2008 уже не COW, где-то по дороге с VS98 поменяли.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37048020
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAnatoly Moskovsky, проверил. В VS2008 уже не COW, где-то по дороге с VS98 поменяли.
Ссылки по теме
http://stackoverflow.com/questions/707014/why-vc-strings-are-not-reference-counted
http://us.generation-nt.com/answer/vc6-stl-string-reference-counting-help-7938142.html

Поменяли с VC6 на VC7.
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37084351
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашли важный workaround, мешавший интегрировать C/C++ и D библиотеки в Win32 из-за несовершенства тулкита
Andrej Mitrovic
Currently we have this issue where we can't link D combiled object files with C
applications on Win32 (assuming the D code exports some names with extern(C)).
The problem is optlink outputs OMF type object files, and pretty much all
modern Win32 C compilers (VC/MinGW) expect COFF object file types.

There's agner's objconv tool that can dissasemble optlink's OMF format, but it
won't convert optlink's OMF to COFF since it keeps running into errors.

However, there might be a workaround. *Please not that this is purely
experimental*:

First, download the Delphi Driver Development Kit (DDDK) from here:
https://sites.google.com/site/delphibasics/home/delphibasicsprojects/delphidriverdevelopmentkit

In the bin folder there's a tool called 'omf2d'. This is a tool that converts
Borland's OMF to Intel OMF format, but it seems to be able to convert Optlink's
OMF format to an OMF format that Objconv can use. My guess is that omf2d simply
discards sections it doesn't understand and therefore Objconv uses the
resulting object file without errors. I do not know how safe this is, so take
it with a large grain of salt.

Second, download objconv.exe from: http://www.agner.org/optimize/.
Third, make sure you have MinGW installed since it comes with gcc.exe which
we'll use, or you can modify the batch file I'm providing and use MSVC instead
(I haven't tested this with MSVC yet).

Make sure both omf2d and objconv are in PATH. Then, download the zip file with
the sample project, extract and run the batch file that does all the work:

http://dl.dropbox.com/u/9218759/staticObjLink.zip

I've tried using this with .lib files, but Objconv couldn't convert the .lib
file even after passing it through omf2d, it still keeps getting errors. So for
now this only seems to work with .obj files (compiled with DMD -c). And I don't
know to what extent this will work since this is the only example I've tried
using this technique with for now.
Jan 17 2011
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37087752
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, красота. Сам себе ORM на шаблонах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 alias DataObjectFromSqlCreateTable!(import("db.sql"), "users") User;
                                 // sql source code , table to fetch

 void main() {
    auto obj = new User(null); // that null should actually be a db handle  if you want to be able to commit changes

    // read/write access to the user table, with compile time
    // type and name checks

    obj.first = "Changing my name!";
    obj.date_last_edited = getUTCtime();

    obj.commitChanges(); // save your writes back to the database,  (reasonably) efficiently
 }
полная версия обсуждения тут
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37127579
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случилось!Version D 2.052 Feb 17, 2011
New/Changed Features
64 bit support for Linux
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37255939
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не спеша подтягиваются графические библиотеки.
Поддерживаются DMD2 теперь DWT и GtkD.

Также доводится до ума с использованием возможностей D много кем любимый Qt (QtD).
Хелловорлдный пример с комментами ниже
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
//author Adam D. Ruppe
Anyway, here's a hello world I just whipped up with some comments
to keep in mind - stuff that took me hours to figure out...

The compile line looks like this on Linux:
dmd hello.d -I/usr/local/include/d -L-L/usr/local/lib -L-lqtdgui -L-lqtdcore
-L-lcpp_core -L-lcpp_gui -L-lQtGui -L-lQtCore

Note it takes a few seconds to compile. Pretty slow for D.

It's similar on Windows, but since I don't have my win laptop
available right now I don't quite remember what it was exactly.

Anyway, the program:

// Qt's files are pulled in from the qt.gui or qt.core packages
// Seems to require a pretty long list of imports....
import qt.gui.QApplication;
import qt.gui.QMessageBox;
import qt.gui.QPushButton;
import qt.gui.QWidget;

int main(string[] args) {
    // main looks a lot like a C++ qt program, right down to
    // wanting scope classes so the destructors run in order

    scope app = new QApplication(args);

    scope mywindow = new MyWindow();
    mywindow.show();

    return app.exec();
}

class MyWindow : QWidget {
    this() {
         button = new QPushButton(this);
         setWindowTitle("Hello"); // methods are same as C++ but
                                  // thankfully they use D strings

         // signals and slots are connected by putting the signature
         // in quotes. No need for the SIGNAL or SLOT macro from C++
         // You leave the signal_ or slot_ off (see below)
         connect(button, "clicked", this, "sayHello");
    }

    // signals and slots use a naming convention instead of a label
    // like in C++. signals are declared: void signal_myName();
    // and here is a slot. When connecting, leave signal_ or slot_
    // off the string
    void slot_sayHello() {
         // the static call like in C++
         QMessageBox.information(null, "hello", "hello");
         this.close();
    }

    QPushButton button;

    // You must remember to mix this in for any class that uses
    // signals and slots to work, otherwise it will segfault at
    // runtime on the connect calls.

    // It's like the C++ Q_OBJECT macro, but while you'd normally
    // put the C++ macro at the top of the class, this mixin needs
    // to be at the bottom of the class or you'll hit forward
    // reference hell when compiling.

    mixin Q_OBJECT;
}
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37410974
anon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

А что, С++ уже стабильная ВЕРСИЯ появилась?
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37448533
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIOBE Programming Community Index for September 2011
September Headline: Programming Language D back in the top 20 тут
...
Рейтинг: 0 / 0
Язык D как альтернатива C++0x
    #37450458
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА по поводу "устаревшей кодировки" вы очень сильно ошибаетесь. Готов спорить на любое количество коньяку, что 1251 еще не раз появится в вашей и моей жизни в самый неподходящий момент. Де-факто в ней работают сотни-тысяч БД вместе с загрузками-выгрузками, CSV, сетевыми протоколами и проч. Про глобальный интер/рунет я вообще молчу.Это конечно печально, что устаревшие кодировки всё ещё используются, особенно для неанглоязычного текста.
...
Рейтинг: 0 / 0
25 сообщений из 166, страница 6 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Язык D как альтернатива C++0x
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]