Поиск C++ подобный STL векторный класс, но использование устройства хранения данных стека

Только для дополнительной информации: Чтобы получить первое решение от работы:

Вам нужно переслать метод друзей следующим образом:

// Boost
#include <boost/serialization/access.hpp>

class ClassB;

namespace boost{
namespace serialization {
    template <typename Ar> void serialize(Ar&,ClassB&,const unsigned);
}
}

class ClassB: public ClassA{

private:
    template <typename Ar> friend void boost::serialization::serialize(Ar&,ClassA&,const unsigned);
public:
    ClassA();
    virtual ~ClassA();
};

Принял меня в то время, чтобы заставить его работать.

Cheers

52
задан Zan Lynx 10 December 2008 в 01:21
поделиться

6 ответов

Вы не должны писать абсолютно новый контейнерный класс. Можно придерживаться контейнеров STL, но изменить второй параметр, например std::vector, чтобы дать ему пользовательское средство выделения, которое выделяет от буфера стека. Авторы хрома записали средство выделения только для этого:

https://chromium.googlesource.com/chromium/chromium / +/master/base/stack_container.h

Это работает путем выделения буфера, где Вы говорите, насколько большой это. Вы создаете контейнер и вызов container.reserve(buffer_size);. При переполнении того размера средство выделения автоматически получит элементы от "кучи" (так как это получено от std::allocator, это будет в этом случае просто использовать средства стандартного средства выделения). Я не попробовал его, но похоже, что это от Google, таким образом, я думаю, что это стоит попытки.

Использование похоже на это:

StackVector<int, 128> s;
s->push_back(42); // overloaded operator->
s->push_back(43);

// to get the real std::vector. 
StackVector<int, 128>::ContainerType & v = s.container();
std::cout << v[0] << " " << v[1] << std::endl;
41
ответ дан cidermole 7 November 2019 в 19:26
поделиться

Если скорость имеет значение, я вижу время выполнения

  • 4 нс int [10], фиксированный размер в стеке
  • 40 нс
  • 1300 нс

для одного глупого теста ниже - всего 2 push, v [0] v [1], 2 pop, на одной платформе, только mac ppc, gcc-4.2 -O3. (Понятия не имею, оптимизировала ли Apple свою stl.)

Не принимайте тайминги, которые вы сами не подделали. И, конечно, каждый шаблон использования отличается. Тем не менее, факторы> 2 меня удивляют.

(Если mems, доступ к памяти, являются доминирующим фактором во время выполнения, что это за дополнительные мемы в различных реализациях?)

#include <stlsoft/containers/pod_vector.hpp>
#include <stdio.h>
using namespace std;

int main( int argc, char* argv[] )
{
        // times for 2 push, v[0] v[1], 2 pop, mac g4 ppc gcc-4.2 -O3 --
    // Vecint10 v;  // stack int[10]: 4 ns
    vector<int> v;  // 40 ns
    // stlsoft::pod_vector<int> v;  // 1300 ns
    // stlsoft::pod_vector<int, std::allocator<int>, 64> v;

    int n = (argv[1] ? atoi( argv[1] ) : 10) * 1000000;
    int sum = 0;

    while( --n >= 0 ){
        v.push_back( n );
        v.push_back( n );
        sum += v[0] + v[1];
        v.pop_back();
        v.pop_back();
    }
    printf( "sum: %d\n", sum );

}
4
ответ дан 7 November 2019 в 09:26
поделиться

Некоторые опции можно хотеть посмотреть на:

STLSoft Matthew Wilson (автор Несовершенного C++) имеет auto_buffer шаблонный класс, который помещает массив по умолчанию на стек, но если это растет, чем выделение стека захватит память от "кучи". Мне нравится этот класс - если Вы знаете, что Ваши контейнерные размеры обычно будут ограниченными довольно низким пределом, тогда Вы получаете скорость локального, складываете выделенный массив. Однако для угловых случаев, где Вам нужно больше памяти, все это все еще работает правильно.

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

Примечанием, которое реализацию я использую сам, не является STLSoft's, но реализация, которая влезает в долги от него.

"Ленивый Программист" сделал сообщение для реализации контейнера, который использует alloca() для устройства хранения данных. Я не поклонник этой техники, но я позволю Вам решить для себя, если это будет тем, что Вы хотите:

http://tlzprgmr.wordpress.com/2008/04/02/c-how-to-create-variable-length-arrays-on-the-stack/

Тогда существует boost::array, который не имеет ни одного из динамического поведения калибровки первых двух, но дает Вам больше эти vector интерфейс, чем просто использование указателей как итераторы, которые Вы получаете со встроенными массивами (т.е., Вы добираетесь begin(), end(), size(), и т.д.):

http://www.boost.org/doc/libs/1_37_0/doc/html/boost/array.html

11
ответ дан Michael Burr 7 November 2019 в 19:26
поделиться

tr1:: выстройте частично соответствует Вашему описанию. Это испытывает недостаток в вещах как нажатие ___ назад (), и т.д., но на это могло бы стоить смотреть как начальная точка. При обертывании его и добавлении индекса к "спине" для поддержки push_back (), и т.д. должно быть довольно легким.

3
ответ дан Boojum 7 November 2019 в 19:26
поделиться

Почему Вы хотите поместить его на стек особенно? Если у Вас есть реализация alloca (), Вы могли buld средство выделения класса с помощью этого вместо malloc (), но идея использовать статически выделенный массив еще лучше: это столь же быстро на большей части архитектуры, и Вы не рискуете повреждением стека Вас, портят.

2
ответ дан Charlie Martin 7 November 2019 в 19:26
поделиться

Можно использовать собственное средство выделения для станд.:: вектор и имеет его, выделяют блоки Вашего стекового устройства хранения данных, подобного Вашему примеру. Класс средства выделения является второй частью шаблона.

Редактирование: я никогда не пробовал это, и рассмотрение документации далее приводит меня полагать, что Вы не можете записать свое собственное средство выделения. Я все еще изучаю его.

4
ответ дан Mark Ransom 7 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: