小编Ped*_*dro的帖子

表达式中的严格别名

假设我们有以下代码:

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint16_t a[] = { 1, 2, 3, 4 };
    const size_t n = sizeof(a) / sizeof(uint16_t);
    
    for (size_t i = 0; i < n; i++) {
        uint16_t *b = (uint16_t *) ((uint8_t *) a + i * sizeof(uint16_t));
        printf("%u\n", *b);
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,转换auint8_t指针并不违反,所以这个问题是关于将结果指针转换为uint16_t指针。根据我的理解,根据标准,它确实违反了严格的别名规则。但是,我不知道从实际情况来看,由于种类ab兼容。唯一可能的违规是将仅存在于这个表达式中buint8_t指针别名化。所以在我的理解中,即使它违反了规则,我也会怀疑它会导致未定义的行为。它可以?

请注意,我并不是说这段代码是有意义的。这个问题纯粹是出于对严格别名的理解的教育目的。

c strict-aliasing language-lawyer

8
推荐指数
1
解决办法
76
查看次数

是否有关于 C 结构包装的任何保证?

是否有关于在 C 中打包结构的任何保证?

举个例子,假设sizeof(double) == 8,是否可以保证sizeof(struct { double x, y; }) == 16

我知道这个问题背后的意图与严格的别名规则相冲突,因此假设严格别名被禁用,例如在 gcc with 的情况下-fno-strict-aliasing

为避免任何进一步的猜测:目的是了解结构与其显式打包对应物的兼容性。请注意,即使在以下情况下,别名也是相关的:是否保证具有相同成员类型的 C 结构在内存中具有相同的布局? . 无需担心我想访问单个字节。

c packing

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

使用赋值运算符时分配免费的 std::vector 副本

当具有原始数据类型的两个实例std::vector具有相同的大小和容量时,是否可以保证通过复制赋值运算符进行复制不会重新分配目标向量?

例子:

const int n = 3;

std::vector<int> a, b;

// ensure defined capacity
a.reserve(n);
b.reserve(n);

// make same size
a.resize(n);
b.resize(n);

// set some values for a
for (int i = 0; i < n; i++)
{
    a[i] = i;
}

// copy a to b: allocation free?
b = a;
Run Code Online (Sandbox Code Playgroud)

我只发现“否则,*this 拥有的内存可能会在可能的情况下被重用。” (自 C++11 起)位于cppreference.com。我希望是“必须”而不是“可能”。

如果对于更一般的情况(例如“相同大小就足够了”)应该有一个肯定的答案,那就更好了。

如果没有保证,这种情况可能是复制 std::vector: 更喜欢赋值或 std::copy?的答案。,什么时候std::copy会首选。

c++ stl c++11

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

标签 统计

c ×2

c++ ×1

c++11 ×1

language-lawyer ×1

packing ×1

stl ×1

strict-aliasing ×1