相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

索引结构是否合法?

无论代码有多糟糕,并且假设对齐等在编译器/平台上不是问题,这种未定义或破坏的行为是什么?

如果我有这样的结构: -

struct data
{
    int a, b, c;
};

struct data thing;
Run Code Online (Sandbox Code Playgroud)

它是合法的访问a,bc作为(&thing.a)[0],(&thing.a)[1](&thing.a)[2]

在每种情况下,在我尝试过的每个编译器和平台上,我尝试过的每个设置都"有效".我只是担心编译器可能没有意识到bthing [1]是相同的东西,并且'b'的存储可能被放入寄存器中,而东西[1]从内存中读取错误的值(例如).在每种情况下,我都尝试过它做了正确的事情.(我当然意识到这一点并不多见)

这不是我的代码; 它是我必须使用的代码,我对这是代码还是破坏代码感兴趣,因为不同影响我更改它的优先级:)

标记C和C++.我最感兴趣的是C++,但如果它不同,我也会感兴趣.

c c++ struct

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

严格混叠规则对“包括上述类型之一的聚合或联合类型”的严格别名规则有什么影响?

以前,在basic.lval中有以下要点:

集合或联合类型,在其元素或非静态数据成员(递归包括子集合或包含的联合的元素或非静态数据成员)中包括上述类型之一,

在当前草案中,它已消失。

WG21的网站上有一些背景信息:http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051

7.2.1 [basic.lval]第10段的别名规则是从C改编而成,并增加了C ++。但是,许多要点要么不适用,要么被其他要点包含。例如,在C中需要为集合和联合类型提供结构分配,这在C ++中是通过C ++中的构造函数和赋值运算符完成的,而不是通过访问完整对象来完成的。

谁能告诉我,这是什么意思?这个严格的别名规则与C中的结构分配有什么关系?

cppreference对此规则说:

这些项目符号描述了C ++中不会出现的情况

我不明白,为什么这是真的。例如,

struct Foo {
    float x;
};

float y;
float z = reinterpret_cast<Foo*>(&y)->x;
Run Code Online (Sandbox Code Playgroud)

最后一行似乎完成了项目要点描述的内容。它通过包含(成员)的集合访问y(a )。floatfloatx

谁能对此有所启发?

c++ struct strict-aliasing language-lawyer

3
推荐指数
1
解决办法
109
查看次数