标签: restrict

限制Textinput字段中的字符集

我有一个TextInput字段,应该限制为大写字母,小写字母,数字和下划线.这是我试图用来限制字符的代码:

restrict="\\A-Z\\a-z\\0-9\\ \\_\\-"
Run Code Online (Sandbox Code Playgroud)

我正在为这个Textinput组件使用MXML.

不幸的是,这不会限制\字符,这是我想要限制的最后一个字符.

如何将反斜杠添加到受限字符列表中?

谢谢

斯蒂芬

apache-flex mxml character restrict textinput

7
推荐指数
1
解决办法
1万
查看次数

在tmpfile_s中限制的目的是什么?

从C11草案:

C11(n1570),§K.3.5.1.1该tmpfile_s功能
errno_t tmpfile_s(FILE * restrict * restrict streamptr);

restrict这里有资格赛的目的是什么?

因为没有其他参数,编译器能够知道streamptr没有别名restrict,不是吗?

c restrict c11 restrict-qualifier

7
推荐指数
1
解决办法
227
查看次数

使用 GSL 跨度时避免丢失 __restrict__

我(主要)喜欢新的 C++ 核心指南倡议,以及指南支持库提供的内容。具体来说,我想更多地使用spans 。__restrict__然而,当我想/需要使用 C++ 时,我遇到了不属于 C++的问题。

更具体地说:如果没有span's,我会声明:

void foo(int* __restrict__ p, size_t len);
Run Code Online (Sandbox Code Playgroud)

但如果我现在声明:

void foo(gsl::span<int> s);
Run Code Online (Sandbox Code Playgroud)

__restrict__除非我的编译器超级智能,否则我不会得到效果。我可以向 gcc/clang/msvc 之神祈祷并说:

void foo(gsl::span<int> __restrict__ s);
Run Code Online (Sandbox Code Playgroud)

或者,我可以调整 GSLspan<T>实现,以便T* beginT* end指针本身被__restrict__编辑。然而,根本不确定这一点是否会得到尊重。

那么,我可以以__restrict__某种方式强制离子吗?或者我应该放弃它?这会失去切换到span's 的乐趣...

c++ restrict guideline-support-library

7
推荐指数
0
解决办法
265
查看次数

为什么printf中的格式标记为restrict?

我刚碰巧看了printf(和其他fprintf类函数)的原型-

int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)

restrict如果我理解正确的关键字,如果标记了其中一个,则禁止通过两个指针访问同一个对象restrict.

这里引用了与C标准相同的例子.

restrict我认为标记格式的一个好处是保存函数,使其不会在执行期间修改格式字符串(比如因为%n格式说明符).

但这是否会产生更大的约束?这会使以下函数调用无效吗?

char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)

因为这里有明显的别名.为什么将restrict关键字添加到format参数中printf

c printf restrict

7
推荐指数
1
解决办法
608
查看次数

C中"限制"的关键字相反?

由于严格的别名可能有助于编译器更好地优化,因此C99引入了restrict关键字,如果程序员保证不会通过指向不同类型的指针访问它,则可以将其用作变量的限定符.但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名.因此,变通方法是通过传递-fno-strict-aliasing(GCC标志)来禁用全局严格别名优化.这完全没有意义,因为可能只有两个指针不应该完全优化.因此,为什么不引入一个相反的关键字restrict,告诉编译器不要假设这两个指针指向不同的地址.这有点类似于什么volatile,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们.是否可以创建这样的关键字?

编辑:有一种方法可以解决这个问题.请参阅下面的yano评论.

c restrict strict-aliasing

6
推荐指数
1
解决办法
238
查看次数

对C限制符号感到困惑

首先,cppreference有关于restrict的以下内容:

在每次执行其中声明了受限指针P的块时(通常每次执行其中P是函数参数的函数体),如果通过P(直接或间接)可访问的某些对象被修改,则通过任何方式然后,该块中对该对象的所有访问(包括读取和写入)必须通过P(直接或间接)进行,否则行为是未定义的.

但是在这一段下面它说:

受限制的指针可以自由地分配给不受限制的指针,只要编译器能够分析代码,优化机会就会保留下来:

void f(int n, float * restrict r, float * restrict s) {
   float * p = r, * q = s; // OK
   while(n-- > 0) *p++ = *q++; // almost certainly optimized just like *r++ = *s++
}
Run Code Online (Sandbox Code Playgroud)

在上面,r[0]是一个可以通过受限制的指针访问的对象,r它是通过访问p,这似乎与第一段相矛盾(访问r[0]必须单独通过r)?

第二:

从一个受限指针到另一个受限指针的赋值是未定义的行为,除非从指向某个外部块中的对象的指针指向某个内部块中的指针(包括在调用具有受限指针参数的函数时使用受限指针参数)或者从函数返回(否则当from-pointer的块结束时).

那么,以下代码是否正常?

void foo(char* restrict a, size_t s)
{
    for(char* restrict aa = a; aa < a + s; ++aa) // Is aa in an …
Run Code Online (Sandbox Code Playgroud)

c alias restrict

6
推荐指数
1
解决办法
225
查看次数

为什么clang会忽略__restrict__?

我刚刚测试了一个小例子来检查__restrict__C++ 是否适用于最新的编译器:

void foo(int x,int* __restrict__ ptr1, int& v2) {
   for(int i=0;i<x;i++) {
       if(*ptr1==v2) {
           ++ptr1;
       } else {
           *ptr1=*ptr1+1;
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

当使用最新的gcc(gcc8.1 -O3 -std = c ++ 14)在godbolt.org上尝试时,__restrict__按预期工作:v2只加载一次,因为它不能用别名ptr1.

以下是相关的装配部件:

.L5:
  mov eax, DWORD PTR [rsi]
  cmp eax, ecx # <-- ecx contains v2, no load from memory
  jne .L3
  add edx, 1
  add rsi, 4
  cmp edi, edx
  jne .L5
Run Code Online (Sandbox Code Playgroud)

现在与最新的clang相同(clang 6.0.0 -O3 -std = c ++ 14).它将循环展开一次,因此生成的代码要大得多,但这里是要点:

.LBB0_3: # …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang restrict

6
推荐指数
1
解决办法
839
查看次数

有没有办法告诉C编译器指针没有别名存储?

如果C编译器知道指针没有别名,它可以执行许多优化.例如,如果我用以下代码编译以下函数gcc -O2:

int f_noalias(int *arr, int x)
{
    int res = 0;
    int *p = &arr[17];
    *p = x;
    res += *p;
    res += *p;
    return res;
}
Run Code Online (Sandbox Code Playgroud)

编译器知道读取*p将始终进行评估,x因此生成的代码等效于为以下函数生成的代码:

int f_noalias2(int *arr, int x)
{
    int *p = &arr[17];
    *p = x;
    return 2*x;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果编译器认为指针可能是别名,则它不再执行此优化.例如,如果我们修改f以便在读取之间调用未知函数*p,则生成的代码将取消引用p两次.编译器假定该read_arr函数可能已修改p指向的值.

int f_withalias(int *arr, int x)
{
    int res = 0;
    int *p = &arr[17];
    *p = x;
    res …
Run Code Online (Sandbox Code Playgroud)

c restrict restrict-qualifier

6
推荐指数
1
解决办法
117
查看次数

C ++限制语义

我正在更新性能关键型库以使用限制,这是g ++和MSVC在C ++ 11中使用关键字实施的__restrict。这似乎是最标准的扩展,所以我将使用restrict__restrict互换。

restrict 是C99关键字,但是编译器已经在C ++中定义了它的重要用法。

这篇文章打算成为一个“问题”,询问每种特定于C ++的用途及其含义,然后由CW回答。随时添加/检查/编辑。因此:“帮助!这些restrict关键字的C ++使用是什么意思?”

  1. 合格this(限制方法):

    void Foo::method(int*__restrict a) __restrict { /*...*/ }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 限制参考:

    int&__restrict x = /*...*/;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 限制在模板内:

    std::vector<float*__restrict> x;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 限制成员/字段。从技术上讲,这也适用于C语言struct,但是C ++中的问题要比C语言中的问题更多:

    class Foo final { public: int*__restrict field; };
    
    Run Code Online (Sandbox Code Playgroud)

c++ restrict restrict-qualifier

5
推荐指数
1
解决办法
923
查看次数

SQL Server-将UPDATE限制为特定列

美好的一天。我解释我的情况。有两个用户(user1和user2)。我在SQL Server中有一个表(tblTest),其中包含3列(f1,f2,f3)。我想做的是以下几点:

  1. 拒绝UPDATEf2列,并授予UPDATEf1和f3列user1

  2. 授予UPDATEf2列,并拒绝UPDATEf1和f3列user2

目前,我停留在步骤1)。

这是我所做的:

在我选择的SQL Server中tblTest => Properties => Permissions,选择了user1。

在底部的“ user1的权限”中=>更新,然后单击“列权限”按钮,选中f2拒绝,f1和f3授予。

然后,我使用user1的凭据访问了SQL Server,并尝试更新此表中的一行。

显然,该命令失败,并显示以下消息:

对对象“ tblTest”,数据库“ dbremarksSQL”,模式“ dbo”的“ f2”列拒绝了UPDATE权限。

到目前为止,一切正常。我的问题是其他列也未更新。我希望update命令至少会更新f1和f3列,并拒绝仅对f2进行更新(保持原样)。

那可能吗?

谢谢

顺便说一句,我使用SQL Server 2014 Management Studio。

sql-server restrict user-permissions sql-update

5
推荐指数
1
解决办法
2616
查看次数