У меня вопрос по скорости разыменования указателя. У меня такая структура:
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
У меня вопрос, что из этого будет быстрее и почему?
СЛУЧАЙ 1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
СЛУЧАЙ 2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x > right) ...
if(p[i].y < top) ...
if(p[i].y > bottom) ...
}
Итак, в случае 1 цикл напрямую разыменовывает pRect указатель для получения значений сравнения. В случае 2 новые значения были внесены в локальное пространство функции (в стеке), и значения были скопированы из pRect в локальные переменные. В цикле будет много сравнений.
На мой взгляд, они будут одинаково медленными, потому что локальная переменная также является ссылкой на память в стеке, но я не уверен ...
Кроме того, Лучше продолжать ссылаться на p [] по индексу или увеличивать p на один элемент и разыменовать его напрямую без индекса.
Есть идеи? Спасибо :)