restrict-qualifier相关内容
考虑以下代码: void doesnt_modify(const int *);int foo(int *n) {*n = 42;不修改(n);返回 *n;} doesnt_modify 的定义对编译器不可见.因此,它必须假设 doesnt_modify 更改了 n 指向的对象,并且必须在 return 之前读取 *n(最后一行不能用return 42;代替). 假设,doesnt_mo
..
我浏览了一些文档和问题/答案,看到有人提到了.我读了一个简短的描述,说明它基本上是程序员的一个承诺,即不会使用指针指向其他地方. 谁能提供一些实际案例来证明它的实际使用价值? 解决方案 restrict 表示指针是唯一访问底层对象的东西.它消除了指针别名的可能性,使编译器能够进行更好的优化. 例如,假设我有一台带有特殊指令的机器,可以将内存中的数字向量相乘,我有以下代码: v
..
我已经阅读了许多关于 restrict 关键字的帖子.但几乎我能找到的每个例子似乎都只涉及一个函数的输入参数,也许是一个单一的值.我需要澄清一下我的理解. 我发现了一个函数,它的输入参数和局部变量看起来都完全违反了关键字规则. 使用指向缓冲区的 void* 调用此函数,并将指针声明为 __restrict(这是 Microsoft Visual C++).然而在函数的后面,声明了一个
..
我现在正在做一些代码并且在使用restrict关键字时遇到了一些问题. typedef int* pt;int foo(pt a, pt b){.../* 东西 */} 如果我想限制 a 和 b 怎么办?以下代码失败: typedef int* pt;int foo(pt 限制 a, pt 限制 b){.../* 东西 */} 提前致谢. 解决方案 你需要一个“限制整数的指针"in
..
标题说明了一切.我很好奇为什么strict关键字不属于C ++?我对C ++不太了解,我仍然无法在网上找到任何可以阻止这一点的原因.没有人知道如果C ++标准使用与C相似的方式使用此关键字,会发生什么可怕的事情?就是根本不需要吗? 更多说明:它与使用无关,也许我一生都不会从此关键字中受益.这个问题只是出于好奇,因为约束是C99以来C的一部分,也就是15年. 也请阅读以下内容:我对技术原
..
在zwol对的回答中,通过在一个结构(另一个结构的子集)之间强制转换指针而不是第一个结构来实现C继承是否合法?成员?他举例说明了为什么在类似结构之间进行简单的类型转换并不安全,并且在注释中有一个示例环境,该行为在其中表现出异常:在-O2上用gcc编译以下内容导致其打印"x = 1.000000 some = 2.000000" #include #include
..
我在主函数中声明了一个数组: float A[n][n]; 我的目标是使用restrict关键字将其传递给函数: void func(int n, float restrict A[][n]) 我尝试了上面的语法,但是我没有获得期望的运行时间优化.我也看到了1d数组的这种语法: void func(int n, float A[restrict]) 解决方案 可以限制指针.以下
..
当我编译以下程序时出现错误: gcc tester.c -o tester tester.c: In function ‘main’: tester.c:7:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ptr_X’ tester.c:7:17: error: ‘ptr_X’ undeclared (
..
我想确保gcc知道: 指针指向不重叠的内存块 指针具有32个字节的对齐方式 以下内容正确吗? template void f(const T* __restrict__ __attribute__((aligned(32))) x, T2* __restrict__ __attribute__((aligned(
..
我想看看restrict是否会阻止memcpy访问重叠内存. memcpy函数将 n 个字节从存储区src直接复制到存储区dest .内存区域不应重叠. memmove使用缓冲区,因此没有重叠内存的风险. restrict限定符表示在指针的生存期内,只有指针本身或直接来自指针的值(例如pointer + n)才可以访问该对象的数据.如果不遵循意图声明,并且对象由独立的指针访问,则
..
注意:为了澄清,问题不在于一般使用 restrict 关键字,而是关于将其应用于成员函数如此处所述。 gcc允许您使用 __ restrict __ (相当于C99的 restrict )限定符的GNU ++在一个成员函数上,有效地使这个成为函数范围内的一个限制限定指针。牛肉在哪里? 大多数成员函数在其他成员上工作,通过这个访问它们,这是一个 T * const (并且通常是不确定的)
..
我一直在观看 Mike Acton在C ++中面向数据的设计讲话 CppCon 2014,他给出了这个例子: int Foo :: Bar(int count) { int value = 0; for(int i = 0; i if(m_someDataMemberOfFoo)value ++ } 返回值; } 并解释一些编译器如何保持重读 m_some
..
/ opt /我试图清除编译Blitz ++时出现的警告, local / include / blitz / tinyvec2.h:261:35:warning:在函数上忽略类型限定符return type [-Wignored-qualifiers] /opt/local/include/blitz/tinyvec2.h:264:43:警告:函数上忽略类型限定符返回类型[-Wignore
..
我正在更新性能关键库以使用restrict,如在C ++ 11中通过g ++和MSVC使用关键字 __ restrict 实现的。这似乎是最标准的扩展,所以我将使用 restrict 和 __ restrict 可互换。 restrict 是一个C99关键字,但是编译器在C ++中定义了它的重要用途。 这个帖子是一个“问题”,询问每个C ++的具体使用是什么,它的意思,后面是一个CW答
..
在我编写的程序中,我的一个函数声明如下: bool parse(const sentence& __restrict句) { //无论 } 我编译代码与Microsoft Visual Studio 2010 Express,编译器抱怨: 警告C4227:anachronism used: p> 但是,这个页面的GCC文档说:
..
让我们看看下面的C ++代码: #include int main() { int z = 2; class A { public: const int& X; A(const int& x):x(x){} void show(){ std :: cout x
..
让我们看看下面的C ++代码: #include int main() { int z = 2; class A { public: const int& X; A(const int& x):x(x){} void show(){ std :: cout x
..
让我们看看下面的C ++代码: #include int main() { int z = 2; class A { public: const int& X; A(const int& x):x(x){} void show(){ std :: cout x
..
我总是不确定,restrict关键字在C ++中是什么意思? 是否意味着给这个函数的两个或更多的指针不重叠? 还有什么意思? 解决方案 在他的论文中,
..
限制合格的指针为具有规则被向我解释:由指针访问的任何对象,任何地方修改仅是有史以来指针访问。所以下面是不行的,对吧? 无效agSum为(int *限制X,INT N){ 对(INT I = 0; I&所述; n-1个;我+ +)×[I + 1] + = X [I]; }INT SumAndFree为(int *限制Y,INT N){ agSum(Y); 的printf(“%
..