Действительно ли возможно создать связанный список на стеке в C++?

Когда Вы смотрите здесь mysqldb документация , Вы видите, что они реализовали различные стратегии курсоров. Таким образом, общий ответ: это зависит.

Редактирование: Вот mysqldb документация API . Существует некоторая информация, как каждый тип курсора ведет себя. Стандартный курсор хранит набор результатов в клиенте. Таким образом, я предполагаю, что существуют издержки, если Вы не получаете все строки результата, потому что даже строки, которые Вы не выбираете, должны быть переданы клиенту (потенциально по сети). Мое предположение то, что не то, чтобы отличающееся от postgresql.

, Когда Вы хотите оптимизировать SQL-операторы, которые Вы неоднократно называете со многими значениями, необходимо посмотреть на cursor.executemany (). Это готовит SQL-оператор так, чтобы это не должно было быть проанализировано каждый раз, когда Вы называете его:

cur.executemany('INSERT INTO mytable (col1, col2) VALUES (%s, %s)',
                [('val1', 1), ('val2', 2)])

6
задан Bill the Lizard 19 September 2012 в 22:19
поделиться

10 ответов

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

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

10
ответ дан 8 December 2019 в 04:53
поделиться

Once a function is called, the stack allocation is fixed for that function.

The only way to get more stack memory allocated would be to call another function. Which could then call another function. Which could then call another function. Or maybe they could all be the same function...

Each function call has it's own fixed-size stack, but the function call graph itself is a variable-sized stack of those stacks.

2
ответ дан 8 December 2019 в 04:53
поделиться

Think of arrays. Maybe more than one, if required.

1
ответ дан 8 December 2019 в 04:53
поделиться

Without much info:

Is the recursive implementation a requirement? When you make a recursive call, you get a new stack. Maybe you could use an iterative approach.

1
ответ дан 8 December 2019 в 04:53
поделиться

Используйте alloca () вместо функции malloc () , чтобы динамически выделять память в кадре стека вызывающей функции, а не в куче. Вам не нужно беспокоиться об освобождении памяти, потому что она автоматически освобождается при возврате функции.

текст ссылки

1
ответ дан 8 December 2019 в 04:53
поделиться

Чтобы «создать связанный список в стеке», обычно вы должны использовать такую ​​функцию, как alloca для получить больше памяти стека. Однако это не похоже на то, что вас просят сделать.

Похоже, вы должны хранить в стеке стек , а не произвольный связанный список. В качестве подсказки, общий синтаксис того, что вы хотите сделать:

void push(struct Node *oldHead, String elem) {
    struct Node newHead;
    head.fileName = elem;
    head.next = oldHead.
    struct Node *head = &newHead
    // then you need to continue what you're doing in this function, since
    // returning will effectively pop the stack.

Существуют (нетривиальные) методы для реализации полноценных списков сбора мусора в соответствии с этими строками, но это '

0
ответ дан 8 December 2019 в 04:53
поделиться

Вероятно, вам стоит поговорить со своим профессором и уточнить требования, поскольку из вашего описания это кажется очень странным заданием для нового программиста на C ++. Требовать реализации связанного списка с памятью только в стеке, мягко говоря, странно.

2
ответ дан 8 December 2019 в 04:53
поделиться

Можно использовать оператор адреса C ++ (&) для получения указателя на объект в стеке вместо динамического выделения памяти с помощью new .

Поскольку создание связного списка подобным образом сомнительно, кроме как в качестве домашнего задания, я не уверен, что это действительно требуется. Без образца кода трудно сказать, в чем именно проблема.

0
ответ дан 8 December 2019 в 04:53
поделиться

Если вы знаете, сколько имен файлов вам нужно сохранить, вы можете использовать массив struct Node и построить из него свой список.

Возможной альтернативой итерацией является наличие одного объекта struct Node в вашей функции и передавая указатель на нее в рекурсивном вызове, где вы используете указатель для следующей ссылки объекта Node в этом фрейме стека функций.

Обратите внимание, что в последнем случае список действителен только в самом глубоком рекурсии, список снова разбивается, когда рекурсивные вызовы возвращаются к вызывающему.

0
ответ дан 8 December 2019 в 04:53
поделиться

Я создал небольшой образец, который может вас вдохновить. Я создаю односвязный список элементов в стеке. Обратите внимание, как список создается в обратном порядке и как рекурсия используется для «распределения» необходимого вам количества элементов. Также обратите внимание, как список передается как параметр. Надеюсь, это поможет, удачи.

#include <cstdio>

using namespace std;

struct Node {
    Node* next_;
    int value_;
};

// Creates a linked list of nodes containing raising values.
void intList(Node* prevNode, int restValue) {
    if (restValue) {
       // A node on the stack, which is linked to list created so far.
       Node node;
       node.next_ = prevNode;
       node.value_ = restValue; 
       // Create a next node or print this list if rest runs to zero.
       intList(&node, rest - 1);
    }
    else {
    // Depest recursion level, whole list is complete.
    for (Node* iter = prev; iter; iter = iter->next_)
        printf("item %d\n", iter->value_);
    }
}

int main() {
    intList(NULL, 10);
}
7
ответ дан 8 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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