假设我有一个这样的结构:
volatile struct { int foo; int bar; } data;
data.foo = 1;
data.bar = 2;
data.foo = 3;
data.bar = 4;
Run Code Online (Sandbox Code Playgroud)
是否保证所有分配都不会重新排序?
例如,如果没有 volatile,编译器显然可以将它优化为两个不同顺序的指令,如下所示:
data.bar = 4;
data.foo = 3;
Run Code Online (Sandbox Code Playgroud)
但是对于 volatile,是否要求编译器不要做这样的事情?
data.foo = 1;
data.foo = 3;
data.bar = 2;
data.bar = 4;
Run Code Online (Sandbox Code Playgroud)
(将成员视为单独的不相关的易失性实体 - 并进行重新排序,我可以想象它可能会尝试改善引用的局部性,以防foo和bar位于页面边界 - 例如。)
此外,答案是否与 C 和 C++ 标准的当前版本一致?
我知道当“发生编码错误”时,snprintf将返回一个负值
但是,会产生该结果的这种“编码错误”的简单示例是什么?
我正在使用gcc 10.2.0 C 编译器,并且我尝试过格式错误的格式说明符、不合理的大数字字段长度,甚至空格式字符串。
这涉及重复执行以下操作:
length += snprintf(...
Run Code Online (Sandbox Code Playgroud)
建立一个格式化的字符串。
如果确定不会返回负值,那可能是安全的。
将缓冲区指针前移一个负长度可能会导致它越界。但我正在寻找一个真正发生这种情况的案例。如果存在这种情况,则可能需要增加其复杂性:
length += result = snprintf(...
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找不到值得为检查编译器可能永远不会产生的值增加复杂性的场景。也许你可以举一个简单的例子。