使用指向非常量指针和指向相同地址的常量参数的指针的函数调用

2024-02-08

我想编写一个函数,输入一个数据数组并使用指针输出另一个数据数组。

我想知道如果两者都结果是什么src and dst指向相同的地址,因为我知道编译器可以针对 const 进行优化。这是未定义的行为吗? (我标记了 C 和 C++,因为我不确定它们之间的答案是否可能不同,并且我想了解两者。)

void f(const char *src, char *dst) {
    dst[2] = src[0];
    dst[1] = src[1];
    dst[0] = src[2];
}

int main() {
    char s[] = "123";
    f(s,s);
    printf("%s\n", s);
    return 0;
}

除了上述问题之外,如果我删除以下内容,这是否定义明确const在原始代码中?


虽然该行为确实是明确定义的 - 但它是not确实,编译器可以按照您的意思“优化 const”。

也就是说,编译器是not允许假设仅仅因为参数是const T* ptr,指向的内存ptr不会通过另一个指针改变。指针甚至不必相等。这const是一项义务,而不是保证 - 您(= 函数)有义务不通过该指针进行更改。

为了真正得到这个保证,你需要用restrict关键词。因此,如果编译这两个函数:

int foo(const int* x, int* y) {
    int result = *x;
    (*y)++;
    return result + *x;
}

int bar(const int* x, int* restrict y) {
    int result = *x;
    (*y)++;
    return result + *x;
}

the foo()函数必须读取两次x, while bar()只需要读一次:

foo:
        mov     eax, DWORD PTR [rdi]
        add     DWORD PTR [rsi], 1
        add     eax, DWORD PTR [rdi]  # second read
        ret
bar:
        mov     eax, DWORD PTR [rdi]
        add     DWORD PTR [rsi], 1
        add     eax, eax              # no second read
        ret

See this live on GodBolt https://godbolt.org/z/NnG9dP.

restrict仅是 C 中的一个关键字(自 C99 起);不幸的是,到目前为止它还没有被引入到C++中(可怜的原因是在C++中引入它比较复杂)。然而,许多编译器确实支持它,因为__restrict.

底线:编译器在编译时必须支持您的“深奥”用例f(),并且不会有任何问题。


See this post https://stackoverflow.com/q/745870/1593077 regarding use cases for restrict.

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

使用指向非常量指针和指向相同地址的常量参数的指针的函数调用 的相关文章

随机推荐

  • win32 导出为固定格式

    我试图更改 Excel 文件的页脚 然后使用 Python3 6 中的 win32 包将其转换为 pdf 它实际上适用于我的家用电脑和工作电脑 只有 pdf 导出部分给了我错误 我想知道 MS Office 版本是否重要 因为我家里使用的是
  • d3.js 节点在强制布局中快速拖动时“跳回”

    我正在使用具有零重力和电荷值的力布局 var force d3 layout force gravity 0 charge 0 friction 0 9 linkDistance 250 linkStrength 1 size width
  • MySql查询缓存中的“query_cache_wlock_invalidate”有什么用?

    在添加MySql Query Cache的概念时 我们有一个名为 query cache wlock invalidate 的参数 我想知道这个参数有什么用 Thanks 当您在查询缓存中进行查询时 通常会返回缓存的内容 即使该查询使用另一
  • 无法提交 Hibernate 事务;嵌套异常是 org.hibernate.Transaction 异常:JDBC 提交失败

    我在应用程序中使用 Windows Azure SQL Server 当我连接到应用程序时 它显示以下错误 org springframework transaction TransactionSystemException Could n
  • UIImageView内容模式

    蓝线是图像视图的边界 UIImageView s contentMode is UIViewContentModeScaleAspectFit 我想保持原始图片的比例 怎样才能让图片的左边缘在UIImageView的左边缘 但不喜欢UIVi
  • Android 上的 PhoneGap 不会加载外部脚本

    我正在制作一个简单的应用程序来加载谷歌地图 但问题是每次我加载这个 它无法在我的 Android 模拟器上运行 而在桌面上则可以正常运行 如何让 Phonegap 或 Android 允许外部脚本工作 加载 更新 我总是收到此错误 应用程序
  • 我无法在 Android 真实手机上获取位置

    public class LocationService extends Service private Handler mHandler new Handler private Timer mTimer null private int
  • 有 typeid 可供参考吗?

    我正在寻找一种获取类型名称的方法 类似于typeid但仅供参考 根据这一页 http en cppreference com w cpp language typeid typeid删除引用 如果 type 是引用类型 则结果引用引用的类型
  • 在 C# 中生成运行哈希(或校验和)?

    Preface 我正在执行具有验证提交阶段的数据导入 这个想法是 第一阶段允许从各种来源获取数据 然后在数据库上运行各种插入 更新 验证操作 提交被回滚 但会生成 验证哈希 校验和 提交阶段是相同的 但是 如果 验证哈希 校验和 相同 则将
  • 使用 tfds.load() 无法访问 CelebA 数据集

    我正在尝试在深度学习项目中使用 CelebA 数据集 我有来自 Kaggle 的压缩文件夹 我想解压缩 然后将图像拆分为训练 测试和验证 但后来发现这在我的设备上是不可能的不那么强大 system 因此 为了避免浪费时间 我想使用 Tens
  • 为什么安装opencv后缺少cv2.so?

    今天我将opencv 2 4 4安装到Ubuntu 12 10 但是 import cv2 不起作用 root python Python 2 7 3 default Sep 26 2012 21 53 58 GCC 4 7 2 on li
  • Hello-jni 示例在 Android Studio 2.0 预览版中不起作用

    我正在尝试实施hello jni sample https github com googlesamples android ndk tree master hello jni进入我的项目 我有Gradle2 8 和 com android
  • 切换按钮折叠在 Bootstrap 导航栏中不起作用

    当导航栏折叠时 我的切换按钮不起作用 我已经检查了数据目标几次 看起来没问题 这是我的代码 div class navbar navbar fixed top navbar inverse div class container div d
  • REST API:请求正文为 JSON 或纯 POST 数据?

    我目前正在构建一个 REST API 当前所有 GET 方法都使用 JSON 作为响应格式 POST 和 PUT 操作的最佳实践是什么 在请求正文中使用 JSON 还是纯 POST 我找不到任何关于此事的信息 例如 我看到 Twitter
  • 使用 appcfg.py 时出现意外的关键字参数“context”

    我尝试通过 appcfg py 更新 Google App Engine 上的项目 C gt C Program Files x86 Google google appengine appcfg py update c secondApp
  • 单击时按钮周围出现不需要的轮廓或边框

    我的网站上有一个样式按钮 但是当我单击它时 它会创建一个不需要的边框或轮廓 我不知道是哪个 我怎样才能删除那个边框 以下是与该按钮相关的所有代码 button border hidden cursor pointer outline non
  • UIGraphicsGetImageFromCurrentImageContext() - 内存泄漏

    我正在打开相机UIImagePickerControllerSourceTypeCamera和一个习惯cameraOverlayView这样我就可以拍摄多张照片 而无需 使用照片 步骤 这很好用 但是保存照片功能存在内存泄漏 通过大量的调试
  • 建设 DAL。使用 EDM(来自数据库)

    我必须开发一个在 Windows wpf 中工作的 lob 应用程序 但应该以两种方式部署 使用本地数据库 同一台计算机 具有远程数据库 在同一网络中 我将使用从数据库生成的实体数据模型 dbcontext EF 4 0 VS2012 sq
  • NSURLConnection 返回错误而不是 401 响应

    我有一个 Web API 对于特定请求 如果一切正常 则返回状态代码 200 如果用户未根据授权令牌登录 则返回 401 如果响应状态为 200 则一切正常 但如果响应状态为 401 则似乎无法正常工作 返回代码为 1012 的连接错误 而
  • 使用指向非常量指针和指向相同地址的常量参数的指针的函数调用

    我想编写一个函数 输入一个数据数组并使用指针输出另一个数据数组 我想知道如果两者都结果是什么src and dst指向相同的地址 因为我知道编译器可以针对 const 进行优化 这是未定义的行为吗 我标记了 C 和 C 因为我不确定它们之间