Есть ли какая-то причина, по которой вы не можете использовать alloca () для выделения необходимого пространства в фрейме стека в зависимости от того, насколько большой объект действительно должен быть?
Если вы это сделаете и все равно выложите стек, положите его в выделенную кучу. Я настоятельно рекомендую НЕ объявлять его как static в main () и помещать его в сегмент данных.
Если это действительно так важно, и ваша программа не может выделить его в кучу, ваша программа действительно на самом деле не работает бизнес на этом типе машины.
Что (точно) вы пытаетесь выполнить?
Оба решения хороши, в зависимости от вашей цели.
Делая это, вы не нарушаете код, вы заставляете их использовать C ++ 11 или выше для использования вашей библиотеки. Тем не менее, я считаю это плюсом, так как вам не нужно возиться с множеством ухищрений для поддержки C ++ 98.
При компиляции кода они не должны связываться со стандартной библиотекой, поэтому, если они сделают что-то вроде #defined unique_ptr shared_ptr
, я обвиню ваших пользователей в плохом кодировании, а не вас. И да, вы можете попытаться защитить от множества плохих вещей, сделанных пользователями, таких как перегрузка operator&
(адрес), однако вы получите код, подобный реализациям STL, который тоже не очень хорош. [ 1114]
Использование pimple решает множество проблем, упомянутых выше. Тем не менее, вы не должны использовать его из-за этого. Единственное реальное преимущество pimple - двоичная совместимость.
Поскольку вы не выставляете STL или любые другие библиотеки, кроме своей собственной, вы не должны получать ошибки ссылок на std::string
. (Да, это возможно)
Если вы компилируете свою библиотеку с libc++
, то std::string
на самом деле std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
с макетом памяти, специфичным для libcxx.
Если вы компилируете свою библиотеку с libstdc++
, std::string
становится std::basic_string<char, std::char_traits<char>, std::allocator<char> >
(или более длинным именем для варианта C ++ 11)
См. этот поток для получения дополнительной информации детали