Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) VC6 - опаньки (число прочтений - 10989 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
VC6 - опаньки
30. Января 2007 :: 21:09
Печать  
http://rsdn.ru/forum/?mid=2325962

Цитата:
Ну если многие использовали (и используют) VC++ 6.0 который абсолютно не соответствует стандарту C++, имеет реализацию STL, в которой течет память, и частенько ICEится, то чему удивляться.


Это действительно так? Кто-нибудь сталкивался?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: VC6 - опаньки
Ответ #1 - 31. Января 2007 :: 07:51
Печать  
Что действительно так?
Что многие использовали и используют?
Таки да Улыбка
Ну, по стандарту : навскидку - нет частичной специализации шаблонов, что напрягает, приходится делать через задницу.
По утечкам в stl - хз, я ей почти не пользуюсь. Тем более есть тот же STL-port вместо того, что идет с VC6.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #2 - 31. Января 2007 :: 07:58
Печать  
orefkov писал(а) 31. Января 2007 :: 07:51:
Что действительно так?

Меня, в основном, STL интересует Улыбка

orefkov писал(а) 31. Января 2007 :: 07:51:
По утечкам в stl - хз, я ей почти не пользуюсь. Тем более есть тот же STL-port вместо того, что идет с VC6.


А я вот что-то начал все больше и больше... Вроде пока утечек нет.  Я ведь как понимаю - раз она сделана на основе шаблонов, то мемлики должны ловиться стандартным образом (пока ничего не ловится).

А что STL-port сильно лучше STL в VC6? Лучше-таки перейти?
  
Наверх
 
IP записан
 
PavelS
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 16
Зарегистрирован: 14. Декабря 2006
Re: VC6 - опаньки
Ответ #3 - 31. Января 2007 :: 21:43
Печать  
Uzhast писал(а) 31. Января 2007 :: 07:58:
Меня, в основном, STL интересует Улыбка
У меня основное занятие - С++. С применением STL. Пишу в своей основе на 6-ке. Да, есть отклонения от стандарта. Да, при переходе на 7-ку были грабли, которые в прочем кое-как решаемы. Да, оно мешает. Но 7-ка мне по ряду свойств не понравилась, и пишу на 6-ке, хотя от меня требуют чтобы 7-ка тоже по крайней мере компилила.

Память часто проверял автоматизированными вещами, признаков утечек под 6-ой не обнаруживал и об этом ранее не слышал. В целом ИМХО 6-ка вполне пригодна для писания коммерческого софта.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #4 - 01. Февраля 2007 :: 04:05
Печать  
orefkov писал(а) 31. Января 2007 :: 07:51:
Тем более есть тот же STL-port вместо того, что идет с VC6.

Попробовал поставить. Проблема в том, что заголовочных файлах 1С есть функции, принимающие ссылки на std-объекты Печаль А передавать ссылку на std-объект, созданный в одной реализации STL, в модуль, где используется другая реализация STL, это полный пипец Печаль

Также еще одна проблема в том, что заголовочные файлы ссылаются на объекты, специфичные для VC-шной реализации (аллокаторы, например). Естественно, в STLPort этого может и не быть (и нет в данном случае).

В принципе, можно поправить заголовки, чтобы не было ошибок компиляции, и просто не использовать 1С-функции, работающие с std-объектами... Правда, что делать, если понадобится использовать эти функции? Улыбка

PS. Для хохмы попробовал выделить VC-шный STL в отдельный namespace. С налету не получилось Улыбка А идея заманчивая: STLPort пусть сидит в std, а VC-STL в, например, в vcstd. Тогда и современный STL получится использовать и проблем с 1С не будет Улыбка

PPS. Что-то я разошелся на ровном месте Улыбка Хотя после некоторых раскопок на RSDN таки обнаружил, что STLPort может быть в ряде случаев быстрее. Да и стандарту лучше соответствует.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #5 - 01. Февраля 2007 :: 15:48
Печать  
Uzhast писал(а) 30. Января 2007 :: 21:09:
Это действительно так? Кто-нибудь сталкивался?

Есть мнение, что человек имел ввиду ATL.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: VC6 - опаньки
Ответ #6 - 01. Февраля 2007 :: 16:21
Печать  
spock писал(а) 01. Февраля 2007 :: 15:48:
Uzhast писал(а) 30. Января 2007 :: 21:09:
Это действительно так? Кто-нибудь сталкивался?

Есть мнение, что человек имел ввиду ATL.

Ужасть, скажи им, что spock их за чайников принял. Смех
  

De quelle planète es-tu?
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #7 - 02. Февраля 2007 :: 04:50
Печать  
Улыбка
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #8 - 05. Февраля 2007 :: 12:51
Печать  
orefkov писал(а) 31. Января 2007 :: 07:51:
Ну, по стандарту : навскидку - нет частичной специализации шаблонов, что напрягает, приходится делать через задницу.

Говоришь, нет частичной специализации шаблонов? Улыбка Для хохмы заменил стандартный компилятор Студии на 9-й интеловский. Сделал полный ребилд и ОН НИ РАЗУ МЕНЯ НЕ ОБМАТЕРИЛ. Улыбка Пустячок, а приятно (не каждый день такое бывает).  Интересно было бы проверить этот компилятор на поддержку стандартов... Вообще, вроде бы (на вид) стало быстрее компилироваться Улыбка Хотя, может, мне просто так кажется...

В процессе изучения RSDN накопал пока следующие проблемы в STL VC6:
  • Объект, хранящийся в контейнере, не должен бросать исключений в конструкторе – приводит к ошибкам в list и vector (неправильный размер и итерирование).
  • «функция сортировки списка с предикатом — внутри этим предикатом не пользуется» (http://rsdn.ru/Forum/Message.aspx?mid=569537&only=1)
  • Не работает код: std::string str("12345"); std::wstring wstr(str.begin(), str.end() ); (нет интервального конструктора) http://rsdn.ru/Forum/Message.aspx?mid=1162851&only=1
  • Нарушение стандарта: erase для вектора возвращает итератор.
  • Отсутствуют std::min и std::max (http://rsdn.ru/Forum/Message.aspx?mid=320784&only=1)
  • «В VC6.0 у auto_ptr не было метода reset, и не один SP не исправил этой проблемы...» (http://rsdn.ru/Forum/Message.aspx?mid=1898317&only=1)

Это то, что накопалось на текущий момент. А на текущий момент я нахожусь в середине списка тем про STL VC6, что вывалил поиск. Если что еще накопаю, сообщу Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #9 - 05. Февраля 2007 :: 13:00
Печать  
Uzhast писал(а) 05. Февраля 2007 :: 12:51:
Для хохмы заменил стандартный компилятор Студии на 9-й интеловский. Сделал полный ребилд и ОН НИ РАЗУ МЕНЯ НЕ ОБМАТЕРИЛ. Улыбка

А можешь поподробнее?
Что за компилятор? Где взять?
Как подключить вместо стандартного? и т.д. и тп.?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #10 - 05. Февраля 2007 :: 13:05
Печать  
artbear писал(а) 05. Февраля 2007 :: 13:00:
А можешь поподробнее?
Что за компилятор? Где взять?
Как подключить вместо стандартного? и т.д. и тп.?

Компилятор интеловский, брать на сайте intel.com. Интеграцию со Студией инсталлятор делает сам - возиться не надо. Проблема, правда, в том, что компилятор платный. Можно на сайте взять временный ключ со сроком действия на месяц. Особо несознательные товарищи могут поискать и найти файл с лицензией на более длительные периоды времени   Подмигивание

Вообще, интеловский компилятор считается сильно хорошим. Программы на нем скомпилированные иногда начинают работать сильно быстрее (если, конечно, программа выполняет интенсивные вычисления).
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #11 - 06. Февраля 2007 :: 21:44
Печать  
Здорово лопухнулся я с компилятором  Смех
Я-то думал, что заменил стандартный, а оказывается, и нет. Я оказался введен в заблуждение тем, что при ошибках выдавалось не стандартное "cl.exe", а какой-то другой экзешник. Поэтому, неудивительно, что никаких ошибок компиляции не вылезало.

Чтобы включить использование интеловского компилятора, надо выбрать в меню "Tools" "Intel C++ Compiler Selection Tool" и там установить, что должен использоваться интеловский компилятор. Установил. Вот тут-то оно все и вылезло  Очень довольный

Рассказываю по порядку. Вылезло три основных типа ошибок и предупреждений:
1) Ругается на такие строки:
Код
Выбрать все
	 CSelHistDlg(class PSelHistItemArray *,class CWnd *);	//37 


следующим образом:
Код
Выбрать все
error: invalid redeclaration of type name "PSelHistItemArray" 


Решается элементарным образом - убираем слово class перед PSelHistItemArray. Забавно, но на "class CWnd", "class CValue" не ругается Улыбка

2) warning #1744: field of class type without a DLL interface used in a class with a DLL interface
ругается на
Код
Выбрать все
class IMPORT_1C CGenericItem
{
public:
	CPtrArray m_array; // <= на эту строку
	 CGenericItem(void);	//3
	virtual  ~CGenericItem(void);	//17
	static CGenericItem *  CreateFromString(char const *,int *);	//45
}; 


Вроде бы ему не нравится что в импортируемом из DLL классе используется переменная типа, который не экспортируется из DLL. В принципе, правильно предупреждает. Но в данном случае можно проигнорировать – реализация MFC и у 1С, и у компоненты совпадают. Поэтому в начало файла 1cheaders.h пишем:
#pragma warning (disable : 1744)

3) "Сокрытие имен". "Проблема" отсутствовала в VC6. В новых компиляторах, как я понял, "возникает" регулярно. Суть: в базовом классе есть функция func. В классе-наследнике определяем функцию func, но меняем тип и/или количество параметров. В результате функция базового класса func становится "скрытой". Т.е., чтобы вызвать именно func базового класса, нужно привести объект класса-наследника к базовому классу. Или альтернативный вариант: в определении класса-наследника вставить строку using BaseClass::func; Такие вещи в классах 1С не редкость, поэтому имеем кучу предупреждений. Я ограничился добавлением строки "#pragma warning (disable : 1125)" в 1cheaders.h. Если потом потребуется вызывать функции базовых классов объектов 1С, то либо буду приводить к базовому классу, либо добавлю using.

Ну и еще было кое-что по мелочи. Например, выругался на дублирующееся определение статической переменной в одном классе (в VC6 прокатывало) и т.п. Все решаемо.

Все скомпилировалось, ё-моё!  Очень довольный Все запускается, все тесты проходит нормально. А у меня там наследование одинэсных фреймов и CMyContextBase из 1С++. Так что взаимодействие с 1С не пострадало.

Компилятор оказался сильно дотошным. Находит вещи, которые VC6 не видел. Например, нашел у меня кучу проинициализированных неиспользуемых локальных переменных. VC6 видит только неинициализированные. Т.е. такую неиспользуемую переменную он уже не замечает:
Код
Выбрать все
CDbgMemoryBlock *pBlock = NULL; 


Это, конечно, хорошо, но в неиспользуемые переменные он также записывает и все IMPLEMENT_MY_CONTEXT.

Нашел мелкий незначительный, но забавный косячок (не в смысле травы Улыбка) в CIStringMap, который используется для реализации CMyContextBase. Ругается на строку
Код
Выбрать все
	ASSERT(m_nCount >= 0);  // make sure we don't underflow 



Ругательство:
Код
Выбрать все
warning #186: pointless comparison of unsigned integer with zero
   ASSERT(m_nCount >= 0);  // make sure we don't underflow
   ^
          detected during:
            instantiation of "void CIStringMap<VALUE, ARG_VALUE>::FreeAssoc(CIStringMap<VALUE, ARG_VALUE>::CAssoc *) [with VALUE=int, ARG_VALUE=int]" at line 518
            instantiation of "BOOL={int} CIStringMap<VALUE, ARG_VALUE>::RemoveKey(LPCSTR={const CHAR={char} *}) [with VALUE=int, ARG_VALUE=int]" 


А ведь он, зараза такая, прав!!!!
Определение переменной: UINT m_nCount;
А беззнаковую переменную проверять на условие >= 0 - совершенно дохлый номер  Улыбка

Ну и еще есть приколы в сборке релизного варианта. Там все ASSERT'ы зануляются, поэтому выдается много ворнингов на такие, к примеру, вещи в CIStringMapToIndex
Код
Выбрать все
	bool bFound = (Lookup(szKey, nIndex) == TRUE);
	ASSERT( !bFound );
 


Т.е. bFound становится неиспользуемой переменной  Подмигивание

Скорость компиляции заметно замедлилась. Размер релизной DLL увеличился почти в полтора раза. Однако, думаю, останусь на этом компиляторе. Он и стандарт лучше поддерживает (сколько можно на старье сидеть) и вообще дотошный Улыбка Ну и, говорят, программы более быстрые генерит  Очень довольный
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: VC6 - опаньки
Ответ #12 - 06. Февраля 2007 :: 22:32
Печать  
Мааанументальный труд. Улыбка
Пока дочитал, все забыл, вспомнил только вот что:

1. И в релизе и в дебуге для 1cpp конструкции типа ASSERT /VERIFY не имеют смысла.
Ибо нигде _DEBUG не определен, а без него ассерты выбрасываются, а verify просто игнорируются.
Зачем эта фигня торчит до сих пор в 1cpp я не знаю - тайна сия велика есть.

2. Как ты думаешь, для AMD64 интел С++ компилирует оптимальный код?
А для бленда? Ой, сомневаюсь я, честно.
Хотя для оптимизации под _конкретный_ интел цпу, наверное, лучше нету - даже вручную на асме х#р просчитаешь все эти latency.

3. Насчет стандарта.
Интересно, что интел тебе не выдал кучу варнингов на таких конструкциях:
Код
Выбрать все
for (int i = 0; i < 100; i++); // do something

for (i =0; i < 100; i++); // do something one more time
 


Стандарт, насколько я помню, ограничивает теперь область видимости переменной цикла скобками цикла.
Поэтому этот номер, который запросто проходит в vc6, не ложится в стандарт (требуется повторное определение [типа] переменной цикла).

Когда я тут как-то собирал 1cpp на VS2005, мне таких ошибок вывалило штук шестьсот. Смех

4. Ну и там по-мелочи разные штуки типа забытых typename и т.д.
типа
Код
Выбрать все
template<class VALUE, class ARG_VALUE>
typename CIStringMap<VALUE, ARG_VALUE>::CAssoc*
CIStringMap<VALUE, ARG_VALUE>::NewAssoc(size_t nKeySize)
{
...
}
 


VC6 съест и без typename, а вот тот же VS2005 желает видеть CAssoc* определением типа.

5. За счет чего интересно такое увеличение мышечной массы у релиза? Стероиды?
И что, реально быстрее работает? Или просто более солидно выглядит? Ужас

Uzhast писал(а) 06. Февраля 2007 :: 21:44:
Скорость компиляции заметно замедлилась. Размер релизной DLL увеличился почти в полтора раза. Однако, думаю, останусь на этом компиляторе. Он и стандарт лучше поддерживает (сколько можно на старье сидеть) и вообще дотошный Улыбка Ну и, говорят, программы более быстрые генерит  Очень довольный

Все равно его не брошу, потому что он хороший Подмигивание
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: VC6 - опаньки
Ответ #13 - 06. Февраля 2007 :: 22:51
Печать  
kms писал(а) 06. Февраля 2007 :: 22:32:
1. И в релизе и в дебуге для 1cpp конструкции типа ASSERT /VERIFY не имеют смысла.
Ибо нигде _DEBUG не определен, а без него ассерты выбрасываются, а verify просто игнорируются.
Зачем эта фигня торчит до сих пор в 1cpp я не знаю - тайна сия велика есть.

У кого выбрасываются, а у кого и нет. Если определить свой собственный ASSERT, который будет присутствовать только в случае наличия переменной "ADDIN_DEBUG", то все будет работать так, как надо Улыбка

kms писал(а) 06. Февраля 2007 :: 22:32:
2. Как ты думаешь, для AMD64 интел С++ компилирует оптимальный код?
А для бленда? Ой, сомневаюсь я, честно.
Хотя для оптимизации под _конкретный_ интел цпу, наверное, лучше нету - даже вручную на асме х#р просчитаешь все эти latency.

Когда-то давно читал статью, где сравнивались разные компиляторы. Вроде получилось, что после интеловского компилятора для АМД прирост получался даже больше, чем для Интел Улыбка Очень забавно было прочитать этот факт Улыбка Видать, это просто очень хороший компилятор Улыбка

kms писал(а) 06. Февраля 2007 :: 22:32:
3. Насчет стандарта.
Интересно, что интел тебе не выдал кучу варнингов на таких конструкциях:

1С++ собирать не пробовал. Может, и будет куча приколов. В моем коде багов вообще не возникло, только ворнинги Улыбка Приятно Улыбка Поэтому, пока не поздно, останусь на этом компиляторе. Чтобы сразу привыкать к стандарту. К тому же компилятор легко переключать через меню. Поэтому, если не получится собирать 1С++ интелом, то буду использовать VC6.

kms писал(а) 06. Февраля 2007 :: 22:32:
4. Ну и там по-мелочи разные штуки типа забытых typename и т.д.
типа
Код
Выбрать все
template<class VALUE, class ARG_VALUE>
typename CIStringMap<VALUE, ARG_VALUE>::CAssoc*
CIStringMap<VALUE, ARG_VALUE>::NewAssoc(size_t nKeySize)
{
...
}
 


VC6 съест и без typename, а вот тот же VS2005 желает видеть CAssoc* определением типа.

Ну CIStringMap я потянул в свой проект, чтобы заюзать CMyContextBase. Багов не было Улыбка

kms писал(а) 06. Февраля 2007 :: 22:32:
5. За счет чего интересно такое увеличение мышечной массы у релиза? Стероиды?
И что, реально быстрее работает? Или просто более солидно выглядит? Ужас

ХЗ. Может выравнивание кода, а может он с шаблонами неоптимально работает (хотя вряд ли, конечно). Для проверки скорости нужно сделать тесты с большим количеством данных, а для меня это пока проблематично. Хотя в будущем будут и большие объемы. Вот тогда можно будет и проверить (если проект к тому времени еще будет компилироваться на стандартном VC6).

kms писал(а) 06. Февраля 2007 :: 22:32:
Все равно его не брошу, потому что он хороший Подмигивание

Конечно, хороший! Улыбка Читал где-то, что это самый быстрый компилятор для C++ (в смысле скорости скомпилированных программ). Нормальная поддержка стандарта тоже важная вещь Улыбка Хочу как следует прокачать C++ Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: VC6 - опаньки
Ответ #14 - 06. Февраля 2007 :: 23:13
Печать  
А, не догнал сразу, что ты свой проект собирал.

А CIStringMap, кстати, сильно продвинутая штука по сравнению со стандартным CMap.
Отсутствие CString, довольно равномерная хеш-функция, реально быстрое сравнение строк, автоуправление размером хеш-таблицы...

Только обо всем этом (и зачем это было сделано) мало кто знает...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать