如果指针已经标记为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如果你喜欢)。

链接地址: http://www.djcxy.com/p/64039.html

上一篇: Does restrict help in C if a pointer is already marked const?

下一篇: Histogram Binning of Gradient Vectors