为数据提供有效类型是否会产生副作用?

2024-04-28

假设我有一大块动态分配的数据:

void* allocate (size_t n)
{
  void* foo = malloc(n);
  ...
  return foo;
}

我希望使用指向的数据foo作为一种特殊类型,type_t。但我想稍后再这样做,而不是在分配期间这样做。为了给分配的数据一个有效型,因此我可以这样做:

void* allocate (size_t n)
{
  void* foo = malloc(n);
  (void) *(type_t*)foo;
  ...
  return foo
}

根据 C11 6.5/6,此左值访问应使有效类型type_t:

对于对没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。

然而,该行(void) *(type_t*)foo;不包含任何副作用,因此编译器应该可以自由地对其进行优化,并且我不希望它生成任何实际的机器代码。

我的问题是:像上面这样的技巧安全吗?为数据提供有效类型是否会产生副作用?或者通过优化代码,编译器是否也会优化有效类型的选择?

也就是说,使用上面的左值访问技巧,如果我现在像这样调用上面的函数:

int* i = allocate(sizeof(int));
*i = something;

这是否会导致严格的别名冲突 UB 如预期的那样,或者是现在的有效类型int?


您引用的标准中的短语清楚地仅说明了有关access到对象。有效类型的唯一变化object标准描述的是之前的两个短语,它们清楚地描述了您必须将要使其生效的类型存储到对象中。

6.5/6

如果通过类型将值存储到没有声明类型的对象中 左值的类型不是字符类型,则左值的类型变为 该访问和不修改的后续访问的对象的有效类型 存储的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为数据提供有效类型是否会产生副作用? 的相关文章

  • 如何在C++中生成非常大的随机数

    我想使用 C 生成 0 2 64 范围内的非常大的随机数 我已经使用了 rand 函数 但它没有生成非常大的数字 有人可以帮忙吗 使用c 11 使用标准c 11的随机库 http en cppreference com w cpp nume
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐

  • mysql连接3个表

    如何连接三个具有一个公共列 id 的mysql表 例如 从表1中选择a b 从表2中选择c d 从表3中选择e f 其中id x 谢谢 SELECT t1 a t1 b t2 c t2 d t3 e t3 f FROM table1 t1
  • 访问 Bookshelf.js 中的嵌套关​​系

    我想你可能会说我正在构建一个 reddit 风格的应用程序 所以我有一个主题 该主题有评论 这些评论有父评论等 这是我的评论模型 var Comment bookshelf Model extend tableName comments t
  • 在 Alpine Docker 容器上安装 OpenSSH

    第一次运行 alpine docker 容器并尝试 openssh 安装时 会发生以下情况 ole T docker run it rm alpine bin ash apk add openssh WARNING Ignoring APK
  • 递归 CTE 中的 TSQL GROUP BY

    是否有解决方法可以在循环 CTE 内使用 GROUP BY 或者有解决方法 我需要对 CTE 表的结果集进行分组 并在具有相同 CTE 的另一个循环中使用它 但出现以下错误 不允许使用 GROUP BY HAVING 或聚合函数 递归公用表
  • Angularjs 和 api 之间的内部服务器错误 500

    我正在尝试从 angularjs 保存数据并将其发送到 api 但出现错误 500 内部服务器错误 控制器是一个数组 包含来自 html 页面的范围 任何帮助 控制器 scope save function scope setup push
  • 如果我使用 Apache::DBI 的 connect_cached(),我应该断开连接吗?

    我的基于 mod perl2 的 Intranet 应用程序使用DBI gt connect cached 据推测被覆盖Apache DBI的版本相同 它通常工作得很好 但就在最近 我们的测试服务器开始出现问题 只有两个用户连接 我们的应用
  • 当我添加 orderBy 应用程序在 firestore 中不起作用时

    onSnapshot 中未捕获的错误 错误 查询需要索引 你 可以在 new FirestoreError index cjs js 352 处创建它 在 JsonProtoSerializer push node modules fire
  • Android ADT版本需要20.0.0及以上

    昨天我尝试安装钛appcelerator 在这个过程中我编辑了一些android sdk安装现在我已经将我的android sdk更新到rev 20 但是当我启动eclipse时我收到一个错误 指出sdk需要20 0 0或更高版本 我尝试使
  • 插入触发器是否需要提交语句

    这是实际场景的简化 在哪里可以看到表 B 上缺失的记录 假设有两个数据库表 A B 表 A 上有一个插入触发器 它对表 B 进行插入 但它没有 COMMIT 如果我们通过 JDBC 连接器打开数据库连接 并对表 A 进行插入 并提交 触发器
  • Discord.py:如何等待用户对 BOT 评论的反应?

    我想制作一个 BOT 根据 BOT 帖子上的用户反应来执行某些操作 像这样的东西https i stack imgur com Vz0dZ jpg https i stack imgur com Vz0dZ jpg 但不是为了投票 只是为了
  • 适用于 iOS 7 AVSpeechSynthesisVoice 的 BCP-47 语音代码有哪些?

    今天我对 iOS 7 中提供的语音合成功能感到非常兴奋 我想选择男声 OSX 中默认为 alex 我不知道他的 BCP 47 代码是什么 顺便说一句 如何获取所有语音代码的完整列表 iOS 8 添加了希伯来语 iOS 9 到 12 中没有添
  • 在 Maven Shade 插件中包含依赖项

    我正在尝试使用 Apache 的 commons lang3 创建一个可部署的 jar 但是 我的 Hadoop 所在的 AWS 集群不包含此库 因此我收到了 classNotFoundException 我想我需要手动添加该依赖项 但我在
  • 如何在 Jupyter 笔记本的 HTML 输出中获取垂直滚动条

    当使用具有 500 行的 Excel 在 Jupyter Notebooks 中运行以下代码时 import pandas as pd pd set option display min rows 50 pd set option disp
  • 如何使用 RGB 元组列表在 PIL 中创建图像?

    假设我有一个像素列表 表示为具有 3 个 RGB 值的元组 列表如下list im getdata 像这样 0 0 0 255 255 255 38 29 58 如何使用这种格式的 RGB 值 每个元组对应一个像素 创建新图像 感谢您的帮助
  • 可以从curl访问docker服务,但不能从postman/chrome访问docker服务

    我正在做 docker 入门指南 https docs docker com get started part3 recap and cheat sheet optional https docs docker com get starte
  • Webpack 和外部库

    我正在尝试 webpack http webpack github io http webpack github io 看起来真的很不错 但我有点被困在这里了 假设我正在为库 f ex jQuery 使用 CDN 然后在我的代码中 我想要r
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 挂载 vue 组件 - Vue 3

    我想在 Vue 3 中这样做 new ComponentName propsData title hello world mount 但我收到这个错误 VueComponents component name WEBPACK IMPORTE
  • Azure 表存储和缓存

    是否值得使用 Azure 缓存预览版从 Azure 表存储缓存数据 或者在大型应用程序中表存储是否足够快 Thanks 简短的答案是这取决于 在我当前正在开发的应用程序中 我们使用缓存来处理一些信息来处理从表存储检索数据的延迟并适应每秒所需
  • 为数据提供有效类型是否会产生副作用?

    假设我有一大块动态分配的数据 void allocate size t n void foo malloc n return foo 我希望使用指向的数据foo作为一种特殊类型 type t 但我想稍后再这样做 而不是在分配期间这样做 为了