C++中类变量声明的查询

2023-12-07

我有一个类来表示浮点数的 3D 向量:

class Vector3D
{
    public:

    float x, y, z;
    float * const data;

    Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}

我的问题是:x、y 和 z 是否将在内存中按顺序分配,以便我可以将 x 的地址分配给数据,然后使用数据上的下标运算符将向量分量作为数组访问?

例如,有时我可能想直接访问向量分量:

Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;

有时我可能想通过偏移量访问它们:

Vector3D vec;
for (int i = 3; i--; )
    vec.data[i] = 42.0;

第二个示例是否具有与第一个示例相同的效果,或者我是否会冒覆盖 x、y 和 z 浮点数以外的内存的风险?


不,这是未定义的行为,原因有二:

  • 首先是其他人提到的填充问题。
  • 其次,即使内容被正确填充,使用偏移量取消引用指针也是无效的,这会使其超出其所指向的范围。编译器可以自由地假设这一点,并进行优化,如果违反它,则会导致未定义的行为。

但是,以下内容是有效的:

class Vector3D
{
public:
    std::array<float,3> data;
    float &x, &y, &z;

    Vector3D() : data(), x(data[0]), y(data[1]), z(data[2]) { }
    Vector3D& operator =(Vector3D const& rhs) { data = rhs.data; return *this; }
};

std::array对于 C++0x 来说是新的,基本上等价于boost::array。如果您不需要 C++0x 或 Boost,您可以使用std::vector(并将初始化程序更改为data(3)),虽然这是一个更重量级的解决方案,但它的大小可以从外界修改,如果是的话,那么结果将是 UB。

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

C++中类变量声明的查询 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 重载<<的返回值

    include
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 复杂类型在 ApiController 参数中获取 null

    我不知道为什么我的参数 ParametroFiltro Filtro 变得为空 其他参数 page 和 pageSize 变得正常 public class ParametroFiltro public string Codigo get
  • 包含 http get 调用的 Angular 服务无法与 ng-repeat 一起使用

    我有一个调用服务的角度控制器 该服务负责从 json 文件返回数据 控制器 function projectController scope ajaxServices scope projects ajaxServices getProje
  • 灵活分支与静态分支(Git 与 Clearcase/Accurev)

    我的问题是关于 Git 处理分支的方式 每当您从提交分支时 该分支都不会收到来自父分支的更改 除非您force合并它 但在其他系统中 例如 Clearcase 或 Accurev 您可以指定如何填充分支某种继承机制 我的意思是 使用 Cle
  • C#:将 CSS 注入 MSHTML 实例的最佳方法?

    我正在尝试将一些伴随其他 HTML 的 CSS 注入到 C 管理的 WebBrowser 控件中 我尝试通过底层 MSHTML DomDocument 属性 控件来实现此目的 因为此代码充当完整 IE8 BHO 的原型 问题是 虽然我可以注
  • 如何在 cakephp 3 中的 sql 查询中添加 ` 字符

    我有一个带有特殊字段名称的表 例如 来自 和 订单 该表与另一个cms一起使用 我无法更改表结构 我想使用 cakephp 3 添加记录 但我收到 数据库错误 看来 cakephp 3 的查询没有用 字符进行净化 我在控制器中的代码 tou
  • WaitForInputIdle 不适用于以编程方式启动 mspaint

    我试图打开 mspaint 并在初始化后立即找到它的句柄 但FindWindow回报NULL如果我打电话WaitForInputIdle 如果我尝试使用该功能Sleep 1000 它有效 但我认为等待程序准备好不是正确的方法 这段代码有解决
  • 如何在 TypeScript 中输入具有已知和未知键的对象

    我正在寻找一种方法为以下对象创建 TypeScript 类型 该对象具有两个已知键和一个具有已知类型的未知键 interface ComboObject known boolean field number U string string
  • 使用 PHP 的简单 MVP 示例

    我知道如何与MVC模型 但我不知道如何使用 MVP 我读到了它们之间的差异 但不知道如何实现它 区别是双重的 视图是被动的并且不知道模型 演示者 控制器 更改模型的状态 读取信息并将其传递给视图 public function showUs
  • 如何使用 GData 检索用户的电子邮件地址?

    我正在尝试使用 GData 检索刚刚使用 Google OAuth 授权我的网站的用户的电子邮件地址 真实姓名和个人资料 URL 我们知道如何使用 Google 的 OpenID 流程来请求它 但 OpenID 流程有一个严重的限制 即我们
  • 将鼠标悬停在 上时缩放图像

    我有一个画布 我在上面画了一个图像 var imageObj new Image imageObj onload function context drawImage imageObj 0 0 imageObj src http local
  • 如何使用公司 API 获取公司页面的管理员个人资料详细信息 - Linkedin

    有没有办法使用公司 API 获取管理员个人资料详细信息 公司页面所有者详细信息 或者反之亦然 使用 Profile API 获取用户拥有的公司页面 不是他的雇主 我阅读了文档并可以找到一种方法 非常感谢任何帮助 http developer
  • Volley - 无法解析构造函数“JSONObjectRequest”

    我正在关注这个问题 http www androidhive info 2014 08 android building free wallpapers app part 2 现在我添加了一个启动屏幕并开始了 Volley 请求 本教程所说
  • 在 R 中使用变量创建正则表达式模式

    我有一个功能 ncount lt function num NULL toRead lt readLines abc txt n lt as character num x lt grep n number toRead value TRU
  • 如何绘制一条可选择的线?

    我想创建一个用户能够操纵他绘制的线的应用程序 类似于删除行或选择它 我该怎么做呢 提前致谢 我设法使用硬编码矩形来做到这一点 但我仍然不知道如何使用drawLine 我可以用吗drawPath进行命中测试 这是代码 private bool
  • 如何在 GitHub 存储库中创建文件夹?

    我想在 GitHub 存储库中创建一个文件夹 然后将文件添加到该文件夹 我该如何实现这一目标 TL DR Use 在文件名字段中创建文件夹 例如打字folder1 file1在文件名字段中将创建一个文件夹folder1和一个文件file1
  • 如何在pyparsing中匹配括号/方括号

    我有一个语法标记指定为 list value Suppress oneOf Group delimitedList string value int value list Suppress oneOf 然而 这显然允许 foo bar 如何
  • Oracle SQL:不允许列

    我创建了一个表 CREATE TABLE AIRLINE airline code NUMBER 4 PRIMARY KEY NOT NULL airline name VARCHAR 29 NOT NULL airline address
  • Rails:缺少要链接的主机!请提供 :host 参数或设置 default_url_options[:host]

    我已经在谷歌上搜索了大约 90 分钟 但仍然没有答案 我在哪里设置default url options 我已经设置为config action mailer default url options在其他地方解决同样的错误 但现在我在尝试在
  • NSArray 不区分大小写的indexOfObject

    有没有一种简单的方法可以在 NSString 的 NSArray 中进行不区分大小写的查找 NSArray 的参考文献提到了不区分大小写的排序 但没有提到查找 我可以轻松地编写自己的 fn 来做到这一点 但想知道是否有更简单的方法 我不知道
  • C++中类变量声明的查询

    我有一个类来表示浮点数的 3D 向量 class Vector3D public float x y z float const data Vector3D x 0 0 y 0 0 z 0 0 data x 我的问题是 x y 和 z 是否