SunCC std :: allocator и size_type max_size (size_type) постоянная функция-член? - PullRequest
0 голосов
/ 02 января 2019

Мы используем пользовательский распределитель , который обнуляет память.Там не так много для этого.Он имеет типы и функции-члены, описанные в std :: allocator .

. Недавно я использовал специальный распределитель для std::vector<T, A>A распределителем), который является новымприменение пользовательского распределителя.Он протестировал OK в AIX, BSD, Linux, OSX и Windows.

Тестирование на Solaris вызвало ошибку компиляции.Похоже, SunCC ожидает size_type max_size(size_type) const член-функцию:

//
// /opt/developerstudio12.5/lib/compilers/include/CC/Cstd/memory
//
size_type max_size ()  const
{
  return alloc_.max_size(sizeof(_Tt));
}

И из того же файла, есть size_type max_size (size_type) const:

//
// Alternate allocator uses an interface class (allocator_interface)
// to get type safety.
//
template <class _Tt>
class allocator
{
public:
    ...
    size_type max_size (size_type size) const
    {
      return 1 > UINT_MAX/size ? size_type(1) : size_type(UINT_MAX/size);
    }
};

Я не нахожу полезных хитовпри поиске информации о распределителе Sun.

Мой первый вопрос: откуда взялась эта функция-член?Это специфично для SunCC?Это пережиток ранней реализации Rogue Wave?Или, может быть, что-то еще?

Мой второй вопрос, должна ли эта функция-член быть добавлена ​​только для SunCC?Или мы должны использовать опцию, чтобы отключить его для мобильности?Или может быть что-то еще?


Вот как выглядит компиляция с Sun Studio 12.3 и 12.4:

$ CXX=/opt/solarisstudio12.3/bin/CC gmake xed25519.o
/opt/solarisstudio12.3/bin/CC -DNDEBUG -g -xO3 -DCRYPTOPP_DISABLE_AVX2 -template=no%extdef -c xed25519.cpp
"/opt/solarisstudio12.3/prod/include/CC/Cstd/memory", line 479: Error: Too many arguments in call to "CryptoPP::AllocatorBase<unsigned char>::max_size() const".
"/opt/solarisstudio12.3/prod/include/CC/Cstd/vector", line 387:     Where: While instantiating "std::allocator_interface<CryptoPP::AllocatorWithCleanup<unsigned char, 0>, unsigned char>::max_size() const".
"/opt/solarisstudio12.3/prod/include/CC/Cstd/vector", line 387:     Where: Instantiated from std::vector<unsigned char, CryptoPP::AllocatorWithCleanup<unsigned char, 0>>::max_size() const.
"/opt/solarisstudio12.3/prod/include/CC/Cstd/vector", line 397:     Where: Instantiated from non-template code.
1 Error(s) detected.

Вот как выглядит компиляция с Sun Studio 12.5 и 12.6:

$ CXX=/opt/developerstudio12.6/bin/CC gmake xed25519.o
/opt/developerstudio12.6/bin/CC -DNDEBUG -g -xO3 -template=no%extdef -c xed25519.cpp
"/opt/developerstudio12.6/lib/compilers/include/CC/Cstd/memory", line 479: Error: Too many arguments in call to "CryptoPP::AllocatorBase<unsigned char>::max_size() const".
"/opt/developerstudio12.6/lib/compilers/include/CC/Cstd/vector", line 387:     Where: While instantiating "std::allocator_interface<CryptoPP::AllocatorWithCleanup<unsigned char, 0>, unsigned char>::max_size() const".
"/opt/developerstudio12.6/lib/compilers/include/CC/Cstd/vector", line 387:     Where: Instantiated from std::vector<unsigned char, CryptoPP::AllocatorWithCleanup<unsigned char, 0>>::reserve(unsigned).
"xed25519.h", line 280:     Where: Instantiated from non-template code.
 >> Assertion:   (../lnk/v2vtable.cc, line 49)
    while processing xed25519.cpp at line 0.
gmake: *** [xed25519.o] Error 2
...