Извращения в C++

Тема в разделе "WASM.ZEN", создана пользователем _DEN_, 23 авг 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Вобще говоря язык C++ можно назвать "Век живи - век учись" :) Вот, сегодня научился специализировать шаблоны классов шаблонами классов :))
    Код (Text):
    1.  
    2. template<class T>
    3. class A
    4. {
    5. // ... Шаблон.
    6. };
    7.  
    8. template<>
    9. class A<int>
    10. {
    11. // ... Специализация по инту
    12. };
    13.  
    14. template<class T>
    15. class A<vector<T> >
    16. {
    17. // ... Специализация по шаблону!!! :)
    18. };


    Вот такие пироги. Поделитесь, кто для себя какие открытия делал?
     
  2. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    Для меня было открытием, что можно писать через запятую

    {void * mem, a = func({mem = malloc(1024),memset(mem,0,1024),mem})}

    а ещё то, что в коде

    bool f(){return false;};



    void main(){

    if (f() && somefunc()){};

    }



    somefunc никогда не выполнится
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Loger



    Тут любой "нормальный" оптимизирующий компилятор просто должен заинлайнить f и заметить что условие всегда будет false. Таким образом, весь if можно убрать из кода, что и сделает, например, VC.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quantum





    Это не оптимизирующий компилятор, это входит в стандарт C / C++. Тоесть стандарт гарантирует что



    if(pObject && pObject->IsProperty())



    является нормальным кодом и если pObject равен нулю, то далее проверки не пойдут. Это верно для встроенных типов. Если перегрузить логические операции, то проверки будут выполняться полностью. Именно по этому ОЧЕНЬ не рекомендуется перегружать логику.



    Loger







    Хмм :) А какой параметр у func? Первый раз вижу что аргумент можно в фигурные скобки брать?
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    mem



    фигурные скобки просто выделяют блок, внутри которого можно объявлять локальные переменные.
     
  6. Dart_Bobr

    Dart_Bobr New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    100
    Адрес:
    Ukraine
    Насчет извращений в С++ есть книжечка "Современное проэктирование на С++" - автор Александреску. Правда в книге описаны только извращения с шаблонами.
     
  7. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Loki, boost - вот это навороты... когда разбирался - почти ничего не понимал. А уж открытий для себя сделал просто кучу, хотя до конца как работают некоторые вещи так до сих пор и не понимаю...
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Код (Text):
    1. template<class T>
    2. class A<vector<T> >


    AFAIK, это не специализация шаблоном, а просто частичная специализация типом.

    Т.е. по идее то же, что и
    Код (Text):
    1. template<class T>
    2. class A<T* >




    А специализировать шаблоном можно шаблоны объявленные например так:
    Код (Text):
    1. template<template<class>class>class A;
     
  9. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    С++ и есть само извращение ;)
     
  10. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    "верёвка достаточной длины, чтобы выстрелить в ногу" :)))))))))))
     
  11. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    а вообще учиться предстоит всю жизнь ;) (почти по Ленину =)
     
  12. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    вот такой изврат тоже радует :)

    хттп://w3.korolev-net.ru/forum/viewtopic.php?t=2354
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Kola



    Да, нычо так :)
     
  14. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    Kola

    даааа - жестоко :))
     
  15. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Kola

    Что-то они слишком намудрили, есть метод проще:


    Код (Text):
    1. #define m0(x) ""
    2. #define m1(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x)
    3. #define m2(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x)
    4. #define m3(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x)
    5. #define m4(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x)
    6. #define m5(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x)
    7. #define m6(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x)
    8. #define m7(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x)
    9. #define m8(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x)
    10. #define m9(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x)
    11.  
    12. void main()
    13. {
    14.     char s[]=m9(0);
    15.     return;
    16. }


    BC31 компилирует это нормально, а VC6 жалуется на нехватку памяти ;)
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Black_mirror

    Еще проще :)
    Код (Text):
    1.  
    2. void main()
    3. {
    4.   int*****(около 1000 раз)***** i;
    5. }
    6.  
     
  17. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _DEN_



    На месте pObject в изначальном примере была функция и чтоб узнать что pObject всегда == 0 нужно её сначала инлайнить, а это уже выходит за рамки стандарта. Так что без оптимизации (в общем случае) второе условие тоже попадёт в код.



    А роль IsProperty() я не очень понял... Или это просто ради примера?
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quantum



    somefunc была второй. То что она никогда не выполнится - это стандарт, а то что ее кода не будет в exe-шнике это оптимизация.







    Просто пример. Показать что если pObject == 0, то ничего страшного не будет, т.к. его метод не будет вызван.
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _DEN_



    Только после того как мы докажем что f (которая вместо т.н. pObject) всегда будет 0! Но как мы об этом узнаем без инлайна? - Никак, т.к. стандарт никого не обязывает оптимизировать код.





    Вот, именно! А изначальный пример был несколько иным.
     
  20. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _DEN_

    BC больше 76 звездочек не компилирует, а вот VC сдался на 1011-ой. Но компилируется это очень быстро.