Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Booster
    там на самом деле чит, позволящий не парясь передавать строки по значению:
    Код (Text):
    1. class CString {
    2. ...
    3. protected:
    4.   LPTSTR m_pchData;   // pointer to ref counted string data // это на самом деле не указатель на строку, а указатель на см. ниже
    5. };
    6.  
    7. struct CStringData
    8. {
    9.     long nRefs;             // reference count
    10.     int nDataLength;        // length of data (including terminator)
    11.     int nAllocLength;       // length of allocation
    12.     // TCHAR data[nAllocLength]
    13.  
    14.     TCHAR* data()           // TCHAR* to managed data
    15.         { return (TCHAR*)(this+1); }
    16. };
    так что в стеке будет размер указателя + отожрет 4 * 3 в хипе + сама строка
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    censored
    И нафиг оно? Больше смахивает на геморрой.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Я не разрабатывал MFC ;) Кроме преимущества, о к-ром уже сказал больше ничего на ум не приходит. В какой-то мере с такой строкой можно работать как с POD-типом.

    btw, ты же вроде работал с MFC, странно слышать такие вопросы.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    censored
    Какое-то сомнительное преимущество, в одном месте убавили в другом прибавили, но сделали какую-то хрень. И POD по-моему здесь не причём. Как понимаю, они выделяют память, приводят указатель к CStringData и дёргают его методы и поля, хрень да и только.

    Конечно работал, но желания залезать под капот не было.
     
  5. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    С какими параметрами вручную компилировать простенькую программку с VC6, чтобы она получалась меньше 116 КБ? Правда ли, что можно получить то же весом легче на порядок, не меняя код программы или это то, чем приходится жертвовать при использовании STL в VC6?

    Программка из учебника Дейтелов "Как программировать на C++. 5-е издание." Использует только STL, компилирую из bat вот так:

    Код (Text):
    1. cl /c /nologo -GX GradeBook.cpp
    2. cl /c /nologo -GX fig04_14.cpp
    3. link /SUBSYSTEM:CONSOLE /NOLOGO /RELEASE fig04_14.obj GradeBook.obj
    Все файлы проекта прикрепляю архивом.

    ______________________________________________________________________________
    P.S. Решение нашел, вроде так более-менее устраивает - использовал CRT (если я правиль понимаю - С Runtime-библиотека) и поставил оптимизацию по размеру:

    Код (Text):
    1. cl /c /nologo /O1 /MD -GX GradeBook.cpp
    2. cl /c /nologo /O1 /MD -GX fig04_14.cpp
    3. link /SUBSYSTEM:CONSOLE /NOLOGO /RELEASE fig04_14.obj GradeBook.obj
    Это ведь еще не предел? Думается, можно без CRT и с маленьким размером, чтоб не линковались ненужные элементы STL. И что еще сделать с линкером - объединить секции и взять маленький STUB? Посоветуйте...
     
  6. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    mc black
    Я тоже с минимализмом экспериментировал. Скажу что в основном размер проги зависит от линкера.
    Можно еще много чего наделать:
    1) убрать отладочную информацию (если есть :) )
    2) установить минимальное выравнивание секций (Aligh:выравнивание), но тогда придется прогу обозвать драйвером (SUBSYSTEM:NATIVE).
    3) скомпилировать под определенный процессор (н-р Blend поменять на 486)
    4) убрать выравнивание данных (там же, где процессор)
    5) все либы сделать динамическими
    6) удалить main, поставив точку входа на другую функцию (в Settings - Entry Point symbol)
    Спорю, это еще не все...
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Классы, шаблончеги, stl, черная магия vc6 в пару кб.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    посмотри здесь
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в msvc2008 не удается заюзать константу больше чем int, т.е.
    const __int64 x= 0xFFFFFFFF+1;
    выдает warning C4307 (переполнение)

    это можно както обойти, или может есть какой хороший компилятор вместо msvc2008 в котором такой проблемы нет?
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    const __int64 x= 0x100000000;
     
  11. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    У меня стоит MSVS2008. Если тебе нужно написать значение 0xFFFFFFFF+1 то не нужно извращаться и напиши просто
    0x100000000. Никаких проблем с 64-битными числами я не замечал.
     
  12. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    занятно....
    Код (Text):
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. const __int64 x= 0xFFFFFFFF+1;
    5. const __int64 y= 0x100000000;
    6.  
    7. int main() {
    8.     cout << x << endl;
    9.     cout << y << endl;
    10. }
    выводит
    0
    4294967296

    а мне нужна именно арифметика констант
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вобщем хочу вот такую штуку
    Код (Text):
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. template <int x,int y>
    5. struct mul {
    6.     static const __int64 ret = x*y;
    7. };
    8.  
    9. int main() {
    10.     cout << mul<0x12345678,0x87654321>::ret << endl;
    11. }
    а еще очень надо
    const __int64 x = '12345678';
     
  14. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Все правильно. По умолчанию целочисленные константы имеют размер 4 байта, если вмещаются в них или не указан тип явно в виде суфиксов.
    Код (Text):
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. const __int64 x = 0xFFFFFFFFLL+1;
    6.  
    7. int
    8. main()
    9. {
    10.     cout << x << endl;
    11.     return 0;
    12. }
    Выводит 4294967296.
     
  15. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вот оно как...
    template <__int64 x,__int64 y>
    struct mul {static const __int64 ret = x*y;};
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    а строковую константу в __int64 какнить загнать можно?
    const __int64 x = '12345678';
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Зачем? ^)
     
  18. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    вот ты любопытный)
    затем что вот так нельзя foo<"123">
    а вот так можно foo<'123'> если
    template <int x> class foo;
    но в int больше 4х символов не влазит, а в __int64 влазит аж 8 символов

    а надо это чтобы юзать
    GetProcAddrByHash( hKernel, hash<'Load','Libr','aryA'>::ret )
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    А почему бы хешем(ключом) не сделать строку? То есть std::string?
     
  20. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster всмысле хешем? в ран-тайме? во время компиляции - чтоб символьное имя функции в бинарнике не хранить, а в рантайме-то от импорта по хешу толку мало %)