Если функция alloca () вызывается несколько раз в конкретной функции, гарантируется ли, что все сегменты стека, выделенные ею, образуют непрерывную часть стековой памяти в целом?
гарантируется ли, что все сегменты стека, выделенные им, вместе образуют непрерывную часть стековой памяти?
Нет. Если бы это было гарантировано, вы могли бы прочитать все об этом в его документации. alloca
является реализация определена функция (единственный, кто может сказать вам, что у вас есть на это гарантии — это разработчик вашего компилятора).
Он также нестандартный, небезопасный и непереносимый (в основном хуже, чем при использовании malloc
а также free
в C ++).
Если вы не хотите знать, как ведет себя унаследованный код (используя его), единственная мысль, которую вы получите, используя его, — это более низкое качество кода.
Может быть. Здесь нет alloca
в C, C ++ или Posix. это
частое расширение в системах на основе Unix, но каждая система
определяет это так, как хочет. (Документация по версии GNU
предполагает, что они будут смежными, но я не вижу фактического
гарантия.)
Как говорят другие, короткий ответ «нет».
Однако чтение документации для реализации или даже обратного проектирования может позволить вам сделать такие предположения (или нет).
Я запустил этот пример на 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 байтами …
Дальнейшее обратное проектирование оставлено в качестве студенческого упражнения.
(Из двух тестов я довольно хорошо догадываюсь о том, что происходит без какой-либо документации. Создание еще нескольких должно немного сузить его.)