Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi >> C++, Переход 
:(
    Опции темы
skyboy
Дата 2.12.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(MAKCim @  1.12.2006,  16:35 Найти цитируемый пост)
то, что предложил nickless, прямо скажем несколько больше чем 9

речь шла о том, что мол, без static - полей нельзя реализовать столько полезный механизм, как singleton. Оказалось, что можно. Теперь начинаем цепляться к объему?  smile Ну и ну...
PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Теперь начинаем цепляться к объему?  smile Ну и ну... 

следи за логикой
Цитата

Сложно мне понять до конца, как там синглетон реализован (слава богу с Делфи давно не работал  smile )
как то там все сложно
вот вполне безопасный для однопоточного использования синглетон из 9 строчек

[разве я тут начал цепляться к объему? пример привел просто для сравнения]
Цитата

что мешает мне сделать 

Цитата

сделай
то, что предложил nickless, прямо скажем несколько больше чем 9



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



чтобы не было непоняток, я признаю, что singleton на delphi реализовать можно, но не слишком приятно это делать  smile
Этот вопрос закрыт
Пойдем дальше
Насколько я знаю, union-ов в Delphi тоже нет (или я не прав), register данных тоже
Прйдем по компиляторам (делфисты тоже могут использовать разные компиляторы, если поможет  smile )
Покажите мне реализацию на Pascal/ObjectPascal
 - атрибутов (типа, переменной, функции)
 - offsetof-а (офигенная вещь для реализации списков)
 - typeof-а
 - именованную инициализацию полей структур с обнулением неопределенных полей (есть в C99)
Код

static struct task {
    int    t_time;
    union {
        struct _range {
            long r_min;
            long r_max;
        } t_range;
        double t_number;
    };
} object = {
    .t_time = 12,
    .t_range = { .r_min = 0 }
};

 - диапозоны значений в статически определенных массивах и  индексированные значения
Код

int array[128] = { [0] = 100, [1] = 100, [2 ... 125] = 0, [126] = 100, [127] = 100 };

 - TLS механизм (данные, специфичные для потока) (есть в С99 под видом __thread)
 - неконстантные инициализаторы в статически определенных массивах
Код

void F(int a, int b) {
    int array[2] = {a, b};
}

 - встроенный тип комплексных чисел (complex)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
skyboy
Дата 2.12.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(MAKCim @  2.12.2006,  10:59 Найти цитируемый пост)
Насколько я знаю, union-ов в Delphi тоже нет (или я не прав)

с жесткой типизацией - и union'ы? smile нет. и я понимаю - почему smile можно использовать указатели с присваиванием адреса - подход погибче, чем использование объединений в общем случае. При этом программист уже понимает, на что он идет  smile 
[offtopic] мы обсуждаем недостатки, как отсутствие необходимых нам механизмов или некое неудобство в реализации и использовании их?
[/offtopic]

Цитата(MAKCim @  2.12.2006,  10:59 Найти цитируемый пост)
 - атрибутов (типа, переменной, функции)
 - offsetof-а (офигенная вещь для реализации списков)

Плиз, описывай функциональность: название мало что скажет, если нет полного аналога, а описать функциональный аналог помешает непонимание того, что же требуется(как в случае со "статическими полями класса" - полного аналога нет, но реализовать синглтон возможно).
Цитата(MAKCim @  2.12.2006,  10:59 Найти цитируемый пост)
встроенный тип комплексных чисел (complex) 

Кстати, странно для языка, в котором предусмотрена перегрузка операторов. Экземпляры комплексного типа - это ведь структура на "обычных" типах, да?
В Делфи такого нет. Реализовать несложно, правда, для оперирования надо будет пользовать функциями/процедурами - перегрузки операторов ведь нет.

Добавлено @ 12:13 
Цитата(MAKCim @  2.12.2006,  10:59 Найти цитируемый пост)
typeof-а

    ну, раз нет шаблонов и есть строгая типизация - на кой ляд определять тип? smile Размер - ещё куда ни шло, а вот тип определять странно. Там где есть объекты(я имею в виду реализацию в Delphi), можно использовать механизм RTTI, что удобнее простого typeof, а в "обычном" Паскале нет необходимости определять тип.
PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Кстати, странно для языка, в котором предусмотрена перегрузка операторов. Экземпляры комплексного типа - это ведь структура на "обычных" типах, да?

это язык С, стандарт С99 (это не структура, а тип, такой же как int, long, ... , что, естественно влияет (в лучшую сторону) на скорость выполнения)
Цитата

с жесткой типизацией - и union'ы?

да, а что? очень удобно
могу привести пример, где оно удобно
в IA32 Protection Mode есть такая вещь, как дескриптор
Причем дескрипторы бывают разных типов и оттого меняется назначение отдельных байтов (всего их 8) и групп байтов
Код

struct i386_descriptor {
    __u16    d_byte01;
    __u16    d_byte23;
    __u8      d_byte4;
    __u8      d_byte5;
    union {
        __u8    d_byte6;
        __u8    d_byte7;
        __u16  d_byte67;
    };
};

теперь можно получать доступ как к словам, так и к отдельным байтам слов
Цитата

мы обсуждаем недостатки, как отсутствие необходимых нам механизмов или некое неудобство в реализации и использовании их?


и то, и то
Цитата

Плиз, описывай функциональность

OK
offsetof
Код

struct list_head {
    struct list_head *next, *prev;
};

#define list_entry(ptr, type, member) \
    return (type*)((char*)(ptr) - offsetof(type, member))

void __list_add(struct list_head* entry, struct list_head* prev,
        struct list_head* next) {
    next -> prev = entry;
    entry -> next = next;
    entry -> prev = prev;
    prev -> next = entry;
}

void list_add(struct list_head* entry, struct list_head* list) {
    __list_add(entry, list, list -> next);   
}

...

struct task {
    int     t_time;
    char  t_name[128];
    struct list_head t_list; 
};

static struct list_head list = {
    &list,
    &list
}; /* List of tasks */

int main() {
    int i;

    for (i = 0; i < 50; ++i) {
        struct task* task = malloc(sizeof(struct task));
        if (task != NULL)
            list_add(&task -> t_list, &list);
    }

    struct list_head* listp;
    struct task* taskp;
    for (listp = list.next; listp != &list; listp = listp -> next) {
        taskp = list_entry(listp, struct task, t_list);
        free(taskp);
    }
}

атрибуты к примеру
Код

/* выравнивание */
struct __attribute__((__aligned__(16))) A {
    char a[5];
    short b[2]
};
/* sizeof(struct A) = 16, а не 9 */

Код

/* обратное выравниванию */
struct __attribute__((__packed__)) A {
    char a[5];
    short b[2];
};

Код

struct B { int a; double b; };
union __attribute__((__transparent_union__)) _A {
    struct B b;
    char* c;
    double d;
} A;

void F(A a) {}

...
int main() {
    struct B a;
    char* b;
    double c;
    F(a); /* OK */
    F(b); /* OK */
    F(c); /* OK */
    return 0;
}


Это сообщение отредактировал(а) MAKCim - 2.12.2006, 12:56


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nickless
Дата 2.12.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата(MAKCim @ 2.12.2006, 10:59)
Насколько я знаю, union-ов в Delphi тоже нет (или я не прав), 

Union-ы вещь довольно фундаментальная, конечно есть smile  называется variant record и позволяет делать еще и такие вещи:
Код

TEntryType = (TypeA, TypeB, TypeC);
TEntry = packed record
    s    : string;
    b,
    c    : word;
    case Entry: TEntry3Type of
        TypeA: (
            d : cardinal;
            reserved     : array[0..11] of byte;
        );
        TypeB: (
            e   : int64;
            f: cardinal;
        );
        TypeC: (
            g,
            h    : int64;
        );
end;


Цитата(MAKCim @ 2.12.2006, 10:59)
register данных тоже

Опиши подробнее что они делают 

Цитата(MAKCim @ 2.12.2006, 10:59)
 - атрибутов (типа, переменной, функции)

Код

// выравнивание
{$ALIGN 8}
record Bla
    ...
end;
// обратное выравнивание
packed record Blub
    ...
end;

__transparent_union__ - не знаю, вроде нет (дельфисты, поправте)
Всякие stdcall тоже есть, а еще можно включать/выключать оптимизацию, всякие варнинги и проверки, exceptions для IO операций итд. для отдельных функций/участков кода

Цитата(MAKCim @ 2.12.2006, 10:59)
 - offsetof-а (офигенная вещь для реализации списков)

Вроде нет

Цитата(MAKCim @ 2.12.2006, 10:59)
 - typeof-а

Для классов есть RTTI

Цитата(MAKCim @ 2.12.2006, 10:59)
 - именованную инициализацию полей структур с обнулением неопределенных полей (есть в C99)

Нет, но в delphi все переменные в стеке и так обнуляются компилятором.

Цитата(MAKCim @ 2.12.2006, 10:59)
 - диапозоны значений в статически определенных массивах и  индексированные значения

Нет

Цитата(MAKCim @ 2.12.2006, 10:59)
 - TLS механизм (данные, специфичные для потока) (есть в С99 под видом __thread)

TLS механизм есть и всегда включен, есть threadvar для декларирования поточных переменных

Цитата(MAKCim @ 2.12.2006, 10:59)
 - неконстантные инициализаторы в статически определенных массивах

Инициализаторов локальных переменных в delphi нет в принципе.

Цитата(MAKCim @ 2.12.2006, 10:59)
 - встроенный тип комплексных чисел (complex)

В VCL есть complex.pas, а еще в delphi есть такой тип как Variant, он может принимать любой тип, как встроенный, так и собственный.

А как в C++ насчет встроенного set типа?
Код

var MySet: set of 'a'..'z';
...
MySet := ['a','b','c'];
if 'a' in MySet then ... { do something } ;

Или оператора with?
Код

type
TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
end;
...
Record1: TDateRec;
...
with Record1 do begin
    Year := 1904;
    Month := Jun;
    Day := 16;
end;


Насчет новых стандартов, в новых версиях delphi, 2005 и 2006 есть inline, перегрузка операторов для record-ов, for ... in и еще несколько полезных фич.

Это сообщение отредактировал(а) nickless - 2.12.2006, 15:50


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Опиши подробнее что они делают 

по возможности располагаются в регистрах, а не в памяти
Цитата

А как в C++ насчет встроенного set типа?

встроенного нет
но хочу возразить
имхо, это неправильно, помещать такие вещи в язык
должны существовать библиотеки, реализующие вектора, множества и пр.
в С++ есть std :: set, std :: multiset
Цитата

Или оператора with?

нет
nickless,
я смотрю, Delphi еще не совсем потерян  smile 
Хорошо
в Delphi по определению нет областей видимости для данных в функциях, т. к все они размещаются в начале в стековом фрейме функции. Это раз. По сути нет автоматических объектов (имею в виду объектов классов), т. к все объекты классов размещаются в heap => нет автоматического вызова деструктора объекта (или есть?)  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nickless
Дата 2.12.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата(MAKCim @ 2.12.2006,  15:06)
по возможности располагаются в регистрах, а не в памяти

Такого нет

Цитата(MAKCim @ 2.12.2006,  15:06)
встроенного нет
но хочу возразить
имхо, это неправильно, помещать такие вещи в язык

Если моножество состоит из сложных типов то да, а если это (Jan, Feb...) или несколько целых чисел, то встроенный тип намного эффективнее, т.к. легко оптимизируется до нескольких машинных комманд.

Цитата(MAKCim @ 2.12.2006,  15:06)
я смотрю, Delphi еще не совсем потерян  smile 

А то  smile 

Цитата(MAKCim @ 2.12.2006,  15:06)
в Delphi по определению нет областей видимости для данных в функциях, т. к все они размещаются в начале в стековом фрейме функции.

В C++ они тоже все там находятся, это фича компилятора, но не вижу в этом ничего плохого.

Цитата(MAKCim @ 2.12.2006,  15:06)
По сути нет автоматических объектов (имею в виду объектов классов), т. к все объекты классов размещаются в heap => нет автоматического вызова деструктора объекта (или есть?)

Да, в delphi переменная типа класс по сути всегда указатель, но автоматизм можно реализовать например подсчетом ссылок (см. COM interfaces).

Вот еще одна фича: вложенные функции/продцедуры
Код

function Fun(i: integer)
    procedure Blah
    begin
        ...
    end;
begin
    ...
    Blah;
    .
end;


ЗЫ
Полезная тема, а то я уже потихоньку delphi забывать стал...


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Вот еще одна фича: вложенные функции/продцедуры

как расширение компилятора в GCC
nested functions тоже есть
Цитата

В C++ они тоже все там находятся, это фича компилятора, но не вижу в этом ничего плохого

плохо, что необходимо все переменные объявлять заранее
потому и говорю, что 
Цитата

все они размещаются в начале в стековом фрейме функции.



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nickless
Дата 2.12.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата(MAKCim @ 2.12.2006,  15:58)
плохо, что необходимо все переменные объявлять заранее

Это немного неудобно, но не принципиально


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Daevaorn
Дата 2.12.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 5
Всего: 70



А как насчет оверхеда при принудительном обнулении переменных и членов классов?
PM MAIL WWW   Вверх
Romikgy
Дата 2.12.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(MAKCim @  2.12.2006,  15:58 Найти цитируемый пост)
плохо, что необходимо все переменные объявлять заранее

smile аналог чистого си без плюсов smile

Цитата(nickless @  2.12.2006,  15:23 Найти цитируемый пост)
Если моножество состоит из сложных типов то да, а если это (Jan, Feb...) или несколько целых чисел, то встроенный тип намного эффективнее, т.к. легко оптимизируется до нескольких машинных комманд.

не совсем аналог , но можно юзать enum  smile 

Цитата(Daevaorn @  2.12.2006,  16:46 Найти цитируемый пост)
А как насчет оверхеда при принудительном обнулении переменных и членов классов? 

А точнее ?

PS не один я защищаю дельфи ... smile респект дельфовцам smile
PSS так че респект С++ шникам smile которые корректны и последовательны в высказываниях smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nickless
Дата 2.12.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Цитата(Daevaorn @ 2.12.2006,  16:46)
А как насчет оверхеда при принудительном обнулении переменных и членов классов?

Оверхед не такой уж и большой, а объекты с кучи (вроде) не обнуляются.
ИМХО инициализировать нужно вообще всегда, лучше оверхед чем мусор в переменных.

Цитата(Romikgy @ 2.12.2006, 17:23)
не совсем аналог

Не совсем - это очень мягко сказано  smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
MAKCim
Дата 2.12.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

аналог чистого си без плюсов

?
Цитата

не совсем аналог , но можно юзать enum

enum несколько другое
Цитата

А точнее ?

зачем принудительное обнуление?
если переменная в стеке, т. е где то в функции, то скорее всего она используется и инициализируется (изменяется) явно. В противном случае (если не используется) обнуление - лишнее, поскольку она (переменная) не используется
Итого имеем одну "лишнюю" машинную команду. В любом случае, если переменную надо инициализировать, но каким то образом это забыли сделать, то 0 - это тоже ошибка
Код

; Delphi
...
sub ESP, 4
mov dword ptr [ESP], 0
...

Код

; C
...
sub ESP, 4
...




Это сообщение отредактировал(а) MAKCim - 2.12.2006, 18:41


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 3.12.2006, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(nickless @  2.12.2006,  17:38 Найти цитируемый пост)
Не совсем - это очень мягко сказано


Цитата(MAKCim @  2.12.2006,  17:39 Найти цитируемый пост)
enum несколько другое

а я что сказал , что полный ? нет , но кое что и на них можно сделать
Цитата(MAKCim @  2.12.2006,  17:39 Найти цитируемый пост)
аналог чистого си без плюсов

?

в чистых сях , также все переменые надо сначало определить а потом юзать


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1320 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.