我有一个TextInput字段,应该限制为大写字母,小写字母,数字和下划线.这是我试图用来限制字符的代码:
restrict="\\A-Z\\a-z\\0-9\\ \\_\\-"
Run Code Online (Sandbox Code Playgroud)
我正在为这个Textinput组件使用MXML.
不幸的是,这不会限制\字符,这是我想要限制的最后一个字符.
如何将反斜杠添加到受限字符列表中?
谢谢
斯蒂芬
从C11草案:
C11(n1570),§K.3.5.1.1该
tmpfile_s功能
errno_t tmpfile_s(FILE * restrict * restrict streamptr);
restrict这里有资格赛的目的是什么?
因为没有其他参数,编译器能够知道streamptr没有别名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* begin和T* end指针本身被__restrict__编辑。然而,根本不确定这一点是否会得到尊重。
那么,我可以以__restrict__某种方式强制离子吗?或者我应该放弃它?这会失去切换到span's 的乐趣...
我刚碰巧看了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?
由于严格的别名可能有助于编译器更好地优化,因此C99引入了restrict关键字,如果程序员保证不会通过指向不同类型的指针访问它,则可以将其用作变量的限定符.但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名.因此,变通方法是通过传递-fno-strict-aliasing(GCC标志)来禁用全局严格别名优化.这完全没有意义,因为可能只有两个指针不应该完全优化.因此,为什么不引入一个相反的关键字restrict,告诉编译器不要假设这两个指针指向不同的地址.这有点类似于什么volatile,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们.是否可以创建这样的关键字?
编辑:有一种方法可以解决这个问题.请参阅下面的yano评论.
首先,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) 我刚刚测试了一个小例子来检查__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 -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) 我正在更新性能关键型库以使用限制,这是g ++和MSVC在C ++ 11中使用关键字实施的__restrict。这似乎是最标准的扩展,所以我将使用restrict和__restrict互换。
restrict 是C99关键字,但是编译器已经在C ++中定义了它的重要用法。
这篇文章打算成为一个“问题”,询问每种特定于C ++的用途及其含义,然后由CW回答。随时添加/检查/编辑。因此:“帮助!这些restrict关键字的C ++使用是什么意思?”
合格this(限制方法):
void Foo::method(int*__restrict a) __restrict { /*...*/ }
Run Code Online (Sandbox Code Playgroud)限制参考:
int&__restrict x = /*...*/;
Run Code Online (Sandbox Code Playgroud)限制在模板内:
std::vector<float*__restrict> x;
Run Code Online (Sandbox Code Playgroud)限制成员/字段。从技术上讲,这也适用于C语言struct,但是C ++中的问题要比C语言中的问题更多:
class Foo final { public: int*__restrict field; };
Run Code Online (Sandbox Code Playgroud)美好的一天。我解释我的情况。有两个用户(user1和user2)。我在SQL Server中有一个表(tblTest),其中包含3列(f1,f2,f3)。我想做的是以下几点:
拒绝UPDATEf2列,并授予UPDATEf1和f3列user1。
授予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。
restrict ×10
c ×5
c++ ×3
alias ×1
apache-flex ×1
c11 ×1
character ×1
clang ×1
gcc ×1
mxml ×1
printf ×1
sql-server ×1
sql-update ×1
textinput ×1