如果指针已经标记为const,是否会在C中限制帮助?
只是想知道:当我将限制添加到指针时,我告诉编译器该指针不是另一个指针的别名。 假设我有一个函数,如:
// Constructed example
void foo (float* result, const float* a, const float* b, const size_t size)
{
for (size_t i = 0; i < size; ++i)
{
result [i] = a [0] * b [i];
}
}
如果编译器必须假定result
可能与a
重叠,则必须每次重新读取一次。 但是,作为a
被标记为const
,编译器还假定是固定的,因此取一次就可以了。
问题是,在这种情况下,推荐使用限制的方式是什么? 我当然不希望编译器重新获取a
每一次,但我无法找到有关如何好信息restrict
应该在这里工作。
你的指针是const,告诉任何人你的函数调用你不会触及通过该变量指向的数据。 不幸的是,编译器仍然不知道结果是否是const指针的别名。 您始终可以使用非const指针作为常量指针。 例如,许多函数将const char(即字符串)指针作为参数,但如果愿意,可以将它传递给非const指针,该函数仅仅是让您承诺它不会使用该特定改变任何东西的指针。
基本上,为了更接近你的问题,你需要为a和b添加限制,以便'承诺'编译器使用此函数的任何人不会将结果作为别名传递给a或b。 当然,假设你能够做出这样的承诺。
在C-99标准(ISO / IEC 9899:1999(E))中有const * restrict
例子,例如在第7.8.2.3节中:
strtoimax和strtoumax功能
概要
#include <inttypes.h>
intmax_t strtoimax(const char * restrict nptr,
char ** restrict endptr, int base);
--- snip ---
因此,如果假设标准不会提供这样一个例子,如果const *
对* restrict
是多余的,那么它们确实不是多余的。
这里的每个人似乎都很困惑。 到目前为止,在任何答案中都没有一个const指针的例子。
声明const float* a
不是一个常量指针,而是const存储。 指针仍然是可变的。 float *const a
是一个指向可变浮点的常量指针。
所以问题应该是,有float *const restrict a
任何一点float *const restrict a
(或const float *const restrict a
如果你喜欢)。
上一篇: Does restrict help in C if a pointer is already marked const?