假设有一个$( "#outer-div" ).resizable({
containment: "#another-outer-div",
minWidth: 200,
minHeight: $('#inner-div').height(),
start: function(event,ui) {
var myMinHeight = $('#inner-div').height();
$( "#outer-div" ).resizable( "option", "minHeight", myMinHeight );
},
resize: function(event, ui) {
ui.size.width += (ui.size.width - ui.originalSize.width);
$(this).position({
of: $("#another-outer-div"),
my: "center center",
at: "center center"
})
}
});
指向SHMEM中的某个地址。 char* buffer
的第一个和第二个8字节在缓冲区中包含相应的buffer
和counter1
无符号64位整数,其中counter2
长度为message
。现在让我们看看以下两段代码:
第一
n
第二
uint64_t counter1 = *((uint64_t*)(buffer));
memcpy(buffer_for_message, buffer + 2 * sizeof(uint64_t), n);
uint64_t counter2 = *((uint64_t*)(buffer)+1);
问题:
volatile uint64_t& counter1_ref = *((uint64_t*)(buffer));
volatile uint64_t& counter2_ref = *((uint64_t*)(buffer)+1);
uint64_t counter1 = counter1_ref;
memcpy(buffer_for_message, buffer + 2 * sizeof(uint64_t), n);
uint64_t counter2 = counter2_ref;
,counter1
和counter2
读取内存块的顺序是否未定义?message
,那么counter1
然后message
)?答案 0 :(得分:3)
我认为,即使是第一种情况也会定义订单。这就是原因。
但是,这两个示例都存在问题 - 违反严格的别名规则。
答案 1 :(得分:3)
volatile
本身与重新排序无关。有些编译器在使用volatile
时提供获取和释放语义作为扩展,但这是非标准的。