Вызов alloca () несколько раз приводит к непрерывной части стека?

Если функция alloca () вызывается несколько раз в конкретной функции, гарантируется ли, что все сегменты стека, выделенные ею, образуют непрерывную часть стековой памяти в целом?

3

Решение

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

Нет. Если бы это было гарантировано, вы могли бы прочитать все об этом в его документации. alloca является реализация определена функция (единственный, кто может сказать вам, что у вас есть на это гарантии — это разработчик вашего компилятора).

Он также нестандартный, небезопасный и непереносимый (в основном хуже, чем при использовании malloc а также free в C ++).

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

1

Другие решения

Может быть. Здесь нет alloca в C, C ++ или Posix. это
частое расширение в системах на основе Unix, но каждая система
определяет это так, как хочет. (Документация по версии GNU
предполагает, что они будут смежными, но я не вижу фактического
гарантия.)

4

Как говорят другие, короткий ответ «нет».

Однако чтение документации для реализации или даже обратного проектирования может позволить вам сделать такие предположения (или нет).

Я запустил этот пример на cpp.sh который говорит void* это размер 8 и разница составляет (-32):

// Example program
#include <iostream>
#include <string>
#include <alloca.h>
#include <stdint.h>

int main()
{
void *var1 = alloca(sizeof var1);
std::cout << "sizeof var1: " << sizeof var1 << std::endl;
std::cout << "var1 addr: " << var1 << std::endl;
void *var2 = alloca(sizeof var2);
std::cout << "var2 addr: " << var2 << std::endl;
intptr_t diff = (intptr_t)var2 - (intptr_t)var1;
std::cout << "addr diff: " << diff << std::endl;
}

Да. Не смежно. Может быть, происходит какое-то простое дополнение.

Делая распределение размером 128 байт, получаем разность (-144):

// Example program
#include <iostream>
#include <string>
#include <alloca.h>
#include <stdint.h>

int main()
{
int size = 128;
void *var1 = alloca(size);
std::cout << "var1 addr: " << var1 << std::endl;
void *var2 = alloca(size);
std::cout << "var2 addr: " << var2 << std::endl;
intptr_t diff = (intptr_t)var2 - (intptr_t)var1;
std::cout << "addr diff: " << diff << std::endl;
}

Гектометр Выравнивание не ограничено 32 байтами …

Дальнейшее обратное проектирование оставлено в качестве студенческого упражнения.

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

1