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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
STL в 1С
25. Марта 2007 :: 04:48
Печать  
Антиресно, все-таки, какой STL юзает 1С в 7.7?... Вот, обнаружил в заголовках hash_map. В моей поставке VC6 его нет. А у 1С оно есть  Ужас
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: STL в 1С
Ответ #1 - 15. Октября 2007 :: 22:54
Печать  
А где такое обнаружил?

OFF:
А я тут обнаружил, что VC6 в принципе не поддерживает NRV (named return value optimization):

Код
Выбрать все
class CRVO
{
public:
	CRVO(int n) : m_n(n)
	{
		cout << "CRVO ctor" << endl;
	}
	~CRVO()
	{
		cout << "CRVO dtor" << endl;
	}
	CRVO(CRVO const& rhs)
	{
		cout << "CRVO copy ctor" << endl;
	}
	CRVO& operator=(CRVO const& rhs)
	{
		cout << "CRVO =" << endl;
		return *this;
	}
private:
	int m_n;
};

CRVO get_rvo()
{
	return CRVO(10);
}

// RVO
void test_rvo()
{
	cout << "=== RVO test" << endl;
	CRVO val = get_rvo();
}

CRVO get_nrv()
{
	CRVO temp(30);
	return temp;
}

// NRV
void test_nrv()
{
	cout << "=== NRV test" << endl;
	CRVO val = get_nrv();
}

test_rvo();
test_nrv();
 


VC6 не поддерживает NRV никогда
VC8 поддерживает, если задан хотя бы /O1
ICL9 и 10 поддерживают всегда (ну он, правда, и думает за троих Улыбка)
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: STL в 1С
Ответ #2 - 16. Октября 2007 :: 04:37
Печать  
kms писал(а) 15. Октября 2007 :: 22:54:
А где такое обнаружил?

CBelong и CSheetNames. Отсвечивает некий std::__hashtable_const_iterator. А в types.h некий доброжелатель вставил затычку:
Код
Выбрать все
namespace std {
	template<int A,int B> class  __alloc {
		char index[A][B];};
	template<class A> struct hash {};
	template<class A,class B,class C,class D,class E,class F> struct __hashtable_iterator;
	template<class A> struct select1st;
	//template<class A> class CMetaDataObjArrayTemplate {class A vOne;};
	template<class A,class B,class C> struct __rb_tree_iterator;
	template<class A,class B,class C, class D, class E, class F > 	struct __hashtable_const_iterator;	//776
};

 


Т.е. здесь фактически доопределены отсутствующие в VC6 объекты в пространстве std: функтор hash и итераторы для hash_map (насколько я понял).
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: STL в 1С
Ответ #3 - 16. Октября 2007 :: 09:27
Печать  
Скорее всего, это самодельные классы, которые прогеры 1С запихали в std
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: STL в 1С
Ответ #4 - 16. Октября 2007 :: 09:30
Печать  
orefkov писал(а) 16. Октября 2007 :: 09:27:
Скорее всего, это самодельные классы, которые прогеры 1С запихали в std

Очень непохоже. Скорее всего, это именно std::hash_map.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: STL в 1С
Ответ #5 - 16. Октября 2007 :: 10:35
Печать  
Как показывает поиск, __hashtable_iterator - это извлечение из SGI STL или STLport. В МСовых реализациях STL такой штуки нет. Так что 1С частично переехала на STLport Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: STL в 1С
Ответ #6 - 16. Октября 2007 :: 14:28
Печать  
Хмм. Интересно.

Конечно, это какая-то реализация, но точно сказать сложно.
Это не текущий STLport, однозначно.
Частично похоже на официальный SGI, но не 100%.

У SGI 3.3 реализация такая:
Код
Выбрать все
struct _Hashtable_const_iterator {
  const _Node* _M_cur;
  const _Hashtable* _M_ht;
};

struct _Hashtable_node
{
  _Hashtable_node* _M_next;
  _Val _M_val;
};  

class hashtable {
  hasher		    _M_hash;
  key_equal		 _M_equals;
  _ExtractKey	     _M_get_key;
  vector<_Node*,_Alloc> _M_buckets;
  size_type		 _M_num_elements;
};
 



На мой взгляд, реализация в 1С совпадает для итератора и узла, но не 100% совпадает для hashtable.
Функторов нет, вектор и число элементов есть.

В свое время я hashtable 1С описал таким образом
Код
Выбрать все
//+ SIZEOF R27 0x14
//+ RECONSTRUCTED, NAME GUESSED
class CNamedItemMap
{
public:
	DWORD dw_00;						// 0x00 ; х.з.
	CNamedItemNode*	pStart;				// 0x04
	CNamedItemNode*	pEnd;				// 0x08
	CNamedItemNode*	pEndOfStorage;		// 0x0C
	DWORD nCount;						// 0x10 ; count of non-NULL named items
};
 


Только тогда я не догнал, что это hashtable, у которой внутри вектор Улыбка
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: STL в 1С
Ответ #7 - 16. Октября 2007 :: 14:48
Печать  
kms писал(а) 16. Октября 2007 :: 14:28:
Хмм. Интересно.

Конечно, это какая-то реализация, но точно сказать сложно.
Это не текущий STLport, однозначно.
Частично похоже на официальный SGI, но не 100%.

Ну да. Особенно, если учесть, что в STLport std - это макрос, который может развернуться в хрен знает что. А в 1С, похоже, std в чистом виде.

kms писал(а) 16. Октября 2007 :: 14:28:
У SGI 3.3 реализация такая:
Код
Выбрать все
struct _Hashtable_const_iterator {
  const _Node* _M_cur;
  const _Hashtable* _M_ht;
};

struct _Hashtable_node
{
  _Hashtable_node* _M_next;
  _Val _M_val;
};  

class hashtable {
  hasher		    _M_hash;
  key_equal		 _M_equals;
  _ExtractKey	     _M_get_key;
  vector<_Node*,_Alloc> _M_buckets;
  size_type		 _M_num_elements;
};
 



На мой взгляд, реализация в 1С совпадает для итератора и узла, но не 100% совпадает для hashtable.
Функторов нет, вектор и число элементов есть.

В свое время я hashtable 1С описал таким образом
Код
Выбрать все
//+ SIZEOF R27 0x14
//+ RECONSTRUCTED, NAME GUESSED
class CNamedItemMap
{
public:
	DWORD dw_00;						// 0x00 ; х.з.
	CNamedItemNode*	pStart;				// 0x04
	CNamedItemNode*	pEnd;				// 0x08
	CNamedItemNode*	pEndOfStorage;		// 0x0C
	DWORD nCount;						// 0x10 ; count of non-NULL named items
};
 


Только тогда я не догнал, что это hashtable, у которой внутри вектор Улыбка

Насчет функторов еще можно подумать. Это же пустые классы, для которых стандарт определяет только одно - они должны занимать непустое место. Так может dw_00 - это и есть рассадник функторов? ХЗ как там компилятор оптимизирует. Может, он каждому функтору по байту выделил и один байт оставил для выравнивания.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: STL в 1С
Ответ #8 - 16. Октября 2007 :: 14:54
Печать  
Uzhast писал(а) 16. Октября 2007 :: 14:48:
Ну да. Особенно, если учесть, что в STLport std - это макрос, который может развернуться в хрен знает что. А в 1С, похоже, std в чистом виде.

Ага. А вообще в STLport нехило переработаны hashtable.

Цитата:
Насчет функторов еще можно подумать.

...
Подумал Улыбка
Похоже, ты прав. Все, можно не ломать голову, что за шняга в этом dw_00 Улыбка
  

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