结构体中的指针和值有什么区别?

2024-02-16

给定以下结构:

type Exp struct {
  foo int,
  bar *int
}

在结构中使用指针或值时,性能有何区别?是否有任何开销或者这只是 Go 编程的两个流派?

我会使用指针来实现链式结构,但这是否是我们必须在结构中使用指针以获得性能的唯一情况?

PS:在上面的结构中,我们讨论的是一个简单的 int,但它可以是任何其他类型(甚至是自定义类型)


使用对您的程序功能最有用的形式。基本上,这意味着该值是否有用nil,然后使用指针。

从性能角度来看,复制原始数字类型总是比取消引用指针更有效。即使更复杂的数据结构如果小于一两个缓存线(对于 x86 CPU 来说,小于 128 字节是一个很好的经验法则),复制速度通常仍然更快。

当事情变得更大时,您需要对性能是否担心进行基准测试。 CPU 是very复制数据的效率很高,并且涉及很多变量,这些变量将决定数据的局部性和缓存友好性,这实际上取决于程序的行为以及您使用的硬件。

如果您想更好地了解内存和软件如何交互,这是一个很棒的系列文章:《每个程序员都应该了解的内存知识》 http://lwn.net/Articles/250967/.

总之,我告诉人们根据程序的逻辑选择是否使用指针,稍后再担心性能。

  • 如果需要传递要修改的内容,请使用指针。
  • 如果需要确定某些内容是否未设置/为零,请使用指针。
  • 如果您使用的类型具有带有指针接收器的方法,请使用指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体中的指针和值有什么区别? 的相关文章

随机推荐

  • C++ 将 float* 转换为 glm::vec3

    如何以表单形式投射浮点数数组float to glm vec3 我以为我以前做过 但我丢失了硬盘 我尝试了一些C风格static cast但我似乎无法让它工作 From float to vec3 float data 1 2 3 glm
  • 枚举*所有*哈密尔顿路径

    我知道以前有人问过这个问题 但我没有在任何帖子中找到答案 有人可以建议我一个枚举图中所有哈密顿路径的算法吗 一点背景知识 我正在研究一个问题 其中我必须枚举每个哈密顿路径 进行一些分析并返回结果 为此 我需要能够枚举所有可能的哈密尔顿路径
  • Bootstrap 4 - 如何在移动设备上更改顺序?

    我正在使用 Bootstrap 4 制作一个由两列组成的响应式布局 两列总共有 9 个 div 第一列有 4 个 第二列有 5 个 如果断点低于 LG 我想更改列内 div 的顺序 这是我想要实现的解释和正确的顺序 我目前拥有的 div c
  • 如何在弹性搜索聚合中使用分页(大小和来源)?

    如何在elasticsearch聚合中使用分页 大小和来自 我在聚合中使用了大小和来自 它引发了exmaple异常 我想查询像 GET index nameorder search size 0 query filtered query b
  • 将数学字符串转换为 int

    有没有一种简单的方法可以获取 5 4 等字符串并返回 20 最简单的方法是使用Rhino JavaScript 引擎 http java sun com developer technicalArticles J2SE Desktop sc
  • Angular.js 中基于 OpenID 的身份验证(使用 Flask 后端)

    一 如何实现 Angular js 中基于 OpenID 的身份验证 使用 Flask 后端 Web 应用程序 看起来 Angular js 代码需要合并逻辑 就像这个例子在这里找到的 http espeo pl authenticatio
  • 类型错误:mel() 接受 0 个位置参数,但给出了 5 个

    当我使用 Tacotron 培训笔记本时 我收到一条错误消息 说明了这一点 Traceback most recent call last
  • 您可以在枚举类中使用按位运算符而不进行强制转换吗?

    我喜欢使用枚举类 但有时我将它们用作标志 并且我必须不断地转换为int如果我想使用按位运算符 有没有办法在不铸造的情况下做到这一点 我认为您无法为它们定义运算符 如果我有采用枚举类的函数 我必须这样做吗 enum class Flags F
  • mysql(i)_real_escape_string,安全可靠吗?

    function Query args func get args if sizeof args gt 0 query args 0 for i 1 i lt sizeof args i query preg replace mysql r
  • 如何制作一个使用全局类型但不使用它来扩展项目的 NPM 包?

    问题 任何在许多不同文件中重用大量类型的项目都可以使用在脚本文件 这些类型在整个项目中全局可见 不需要导入 请参阅官方手册 https www typescriptlang org docs handbook modules html 在
  • 编辑 UI 的 task.Wait() 上出现死锁

    我试图在这里找到一些解决我的问题的方法 但没有结果 或者我只是没有得到正确的结果 所以如果有人可以帮助 解释我将非常感激 我正在使用 Win Form 为系统管理员开发一个工具 现在我需要在选定的后台运行的计算机上创建连续的 ping UI
  • 有没有办法改变散点图上的原点轴(零线)?

    有没有办法改变散点图上的轴 假设将轴从 0 0 即 零线 移动到 3 3 之类的位置并制作象限图 我尝试将 xaxis 和 yaxis 上的 zeroline 值设置为False 然后从 shapes 的两个轴上绘制两条常量线 但我想知道是
  • NodeJS MySQL 转储

    我尝试编写一个基本的 cron 脚本来运行和 转储 mysql 数据库 由于某种原因 当它 成功保存文件 时 它确实创建了该文件 但它是空的 如果我不保存文件 而是执行 console log 它会打印一个空字符串 对我可能做错了什么有什么
  • NSView 初始化:-init: 与 -awakeFromNib:

    我有一个简单的课程MyView继承自NSView和实例变量NSImage image 在里面 类的功能是在视图上绘制图像 然而 在 drawRect 图像实例始终相等nil 如果它是在 init 功能而不是nil如果它是在 awakeFro
  • 通过 TCP 传输程序集

    我目前正在尝试通过 TCP 连接发送序列化对象 如下所示 BinaryFormatter formatter new BinaryFormatter formatter Serialize clientStream Object Assem
  • 如何反汇编正在运行的linux内核?

    寻找一种反汇编正在运行的内核的方法 我可以通过 dev kmem 来实现吗 我运行的是linux 2 6 32 或者我可以使用内核模块来运行内核吗 我是初学者 请帮忙 我想做的就是通过查看是否出现某些特定指令来检查内核映像中是否存在某些恶意
  • MediaStyle 通知:播放/暂停按钮不响应单击

    在我的应用程序中 当用户选择要播放的音频文件时 当文件准备好并且播放开始时 会成功显示 MediaStyle 通知 元数据信息已更新 标题 图标等 但是 1 Play Pause button does not respond to cli
  • 在 PyCharm 中调试 asyncio 代码会导致绝对疯狂的不可重复错误

    在我的基于使用 PyCharm 调试器进行调试的 asyncio 和 asyncio tcp 连接的项目中 我遇到了非常非常荒谬的错误 如果我在运行后在代码上放置断点 则断点永远不会触发 但是如果在启动程序之前设置了断点 则会触发断点 但在
  • Select2 下拉更改事件不起作用

    我在用Select2下拉菜单 我需要根据下拉菜单选择执行一些功能 我尝试过以下代码 但它对我不起作用 eventSelect on select2 select function e log select2 select e eventSe
  • 结构体中的指针和值有什么区别?

    给定以下结构 type Exp struct foo int bar int 在结构中使用指针或值时 性能有何区别 是否有任何开销或者这只是 Go 编程的两个流派 我会使用指针来实现链式结构 但这是否是我们必须在结构中使用指针以获得性能的唯