Я пишу небольшой трассировщик лучей, используя иерархии ограничивающих томов для ускорения трассировки лучей. Короче говоря, у меня есть двоичное дерево, и мне, возможно, придется посетить несколько листьев.Изменение размера распределения динамического стека в C++
тока я узел с двумя детьми влево и вправо, а затем во время движения(), если какое-то условие, в этом примере пересекаются(), дети посетили:
class BoundingBoxNode{
BoundingBoxNode* left, *right;
void travel(param &p);
inline bool intersect(param &p){...};
};
void BoundingBoxNode::travel(param &p){
if(this->intersect(p)){
if(left)
left->travel(p);
if(right)
right->travel(p);
}
}
Этот подход использует рекурсивные методы вызовов , однако мне нужно как можно больше оптимизировать этот код ... И согласно Справочному руководству по оптимизации для IA-32, вызовы функций глубже 16 могут быть очень дорогими, поэтому я хотел бы сделать это, используя цикл while вместо рекурсивных вызовов. Но я НЕ хочу делать динамические распределения кучи, поскольку они дороги. Поэтому я думал, что, может быть, я мог бы использовать тот факт, что каждый раз, когда цикл while начинается через стек, он будет находиться в том же положении. В следующем очень уродливые взломать я полагаюсь на ALLOCA() всегда выделять один и тот же адрес:
class BoundingBoxNode{
BoundingBoxNode* left, right;
inline void travel(param &p){
int stack_size = 0;
BoundingBoxNode* current = this;
while(stack_size >= 0){
BoundingBoxNode* stack = alloca(stack_size * 4 + 2*4);
if(current->intersect(p)){
if(current->left){
stack[stack_size] = current->left;
stack_size++;
}
if(current->right){
stack[stack_size] = current->right;
stack_size++;
}
}
stack_size--;
current = stack[stack_size];
}
};
inline bool intersect(param &p){...};
};
Однако удивительно это может показаться, этот подход терпит неудачу :) Но он работает до тех пор, как стек меньше чем 4 или 5 ... Я также вполне уверен, что такой подход возможен, я просто думаю, что мне нужна помощь в правильном его использовании.
Итак, как я могу манипулировать стеком вручную с C++, возможно ли, что я могу использовать некоторое расширение компилятора ... Или я должен делать это ассемблер, и если да, то как мне писать ассемблер, чем можно скомпилировать с помощью как GCC, так и ICC.
Я надеюсь, что кто-то может мне помочь ... Мне не нужен идеальное решение, просто взломать, если он работает это достаточно хорошо для этой цели :)
С уважением Jonas Finnemann Jensen
Тот факт, что вы хотите взломать, вызывает беспокойство, но если вам нужно что-то «достаточно хорошее», просто используйте массив фиксированного размера для стека. –
как ваш алгоритм заканчивается? – TheFogger
В какой-то момент intersect возвращает false, поэтому он заканчивается ... Код здесь показывает только мою проблему ... Он не завершен в контексте ... – jonasfj