- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
代码:
char keyStr[50]={ 0x5F, 0x80 /* bla bla */ };
uint32_t* reCast = reinterpret_cast< uint32_t* >( &keyStr[29] );
uint32_t* reCast2 = ( uint32_t* )&keyStr[29];
if( reCast == reCast2 ){
cout << "Same Thing!";
}
输出:
Same Thing!
我想知道这两种类型转换方法有什么区别。此外,如果您可以指定(通过示例)static_cast、dynamic_cast 和您知道的其他类型的转换之间的区别(即保持尽可能低的级别并尽可能接近汇编语言)。
static_cast
dynamic_cast
const_cast
reinterpret_cast
C-style cast (type)value
Function-style cast type(value)
谢谢。
请阅读 P.S.我从上面的例子中知道 reinterpret_cast 将 keyStr[29] 的地址分配给 int 指针在汇编中将转化为:
lea eax, [keyStr+1D]
mov [reCast], eax
换句话说,reinterpret_cast 在低级别的预期中一点也不危险,因为它不会修改原始数据。
我想知道其他转换方法在底层的表现如何。因此,例如,一个对象,以低级方式,只是一个保存地址的变量。如果该对象是编译器随后如何解释该地址以及它如何偏移它的类型。(这正是我不感兴趣的,在汇编中,我不太关心该变量是否包含一个值,一个指针或一个对象(即另一个指针))。另一件可能相同的事情是 int 和 int* 或 unsigned int 和 int 之间的区别;所有 4 个声明生成相同的汇编指令。 ( push value ) 或者 (sub esp-(length of int) && mov esp, value)我希望这能澄清问题以及为什么我将其标记为“低级代码”和“程序集”
附言在这个程序中,我试图创建我不关心不可移植性或其他高级内容。我正在尝试尽可能低的水平并尽可能接近汇编语言。这意味着,对于这个程序,内存只是内存(即 0 和 1 位),类型并不重要(例如,我不在乎内存地址:0x123 是“int”类型还是“float”类型,它只是“数据”)
最佳答案
reinterpret_cast
和 const_cast
是绕过 C++ 类型系统的方法。正如您在 reinterpret_cast
中所指出的,这通常转化为很少或没有汇编代码。
static_cast
主要遵循 C++ 类型系统。它可以将数字从一种类型转换为另一种类型,或者调用构造函数,或者调用转换函数。或者对于派生到基础的转换,它可能涉及将字节偏移量和/或查找添加到 vtable 中。 static_cast
还可以通过将指针或引用从非虚拟基类型“向下转换”为派生类型来改变类型系统的规则,可能会减去字节偏移量。
然后是指向成员的指针。它们可能与这里的重点无关,但是 static_cast
对它们的作用或多或少类似于类指针转换。
dynamic_cast
更加严格地遵守 C++ 类型系统。在其有用的形式中,它在运行时检查指针/引用是否实际指向/引用指定类型的对象。它通常会在幕后调用神奇的库函数。
具有一个参数的函数式转换与 C 式转换具有完全相同的效果。 (如果有多个参数,函数风格的强制转换必须是使用类构造函数的临时初始化。)C 风格的强制转换首先执行以下列表中有意义的事情:
const_cast
static_cast
static_cast
然后是 const_cast
reinterpret_cast
,或者reinterpret_cast
然后是 const_cast
一个异常(exception):C 风格的转换可以忽略类之间的私有(private)和 protected 继承关系,假装它们具有公共(public)继承关系。
C 风格的强制转换在 C++ 中通常不是首选,因为它不太明确您想要发生的事情。
关于c++ reinterpret cast和c style cast之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27359961/
我很确定我不会是第一个被这个绊倒的人,但我找不到答案。这是作业。 class Tier{} class Fisch extends Tier{} class Vogel extends Tier{}
在接收器开发人员指南中如下: Applications running on the Google Cast receiver device (receiver applications) are a
最近我制作了一个自定义本地 Flask 网站,用于从本地设备转换到连接到我的电视的 RPi4。有一个 GUI它也可以通过 GET 请求控制,这是转换工作的主要方式,实际上是通过 GET 请求将数据从
最近我因为某些原因重置了我的路由器,所以当我尝试将它连接到 chromecast 时,Chromecast 没有在其列表中列出我的 wifi 名称。 之前它工作正常,所以我选择其他并手动输入我的网络名
做这样的 Actor 阵容的好方法是什么? seq { yield (box "key", box "val") } |> Seq.cast 因为这看起来非常难看: seq { yield (box
我继承的遗留 Web 应用程序是在经典 ASP 中为新西兰乐施会定制编写的,它在用户提交的输入上运行字符串替换,删除字符串“cast”,大概是因为 cast 函数。 然而,这意味着我们的参与者都不能拥
我去了三星网站并下载了 Media Control SDK 包。当我在我的 Galaxy S3 Android 4.3 上使用 AllShare Cast 视频播放器时,我的智能电视(在同一网络中)出
如何在 BigQuery 中查看 INT64 的二进制表示形式?将其转换为 BYTES 类型也可以。 最佳答案 正如@Elliot Brossard 所述,INT64 如何执行是一个实现问题。类型表示
Google 的文档要求我们设置自己的网络服务器来托管 receiver.html。 是否有任何人都可以使用的默认公共(public) chrome-cast 接收器? 我只需要非常基本的接收器,与
我在 Eclipse 3.6 (Helios) 中运行某人的代码时遇到问题。代码是用 OpenJDK 7 编写的。我运行的是 Windows 7,我必须为它安装 Java 7。我之前使用的是 Java
所以我有一些 COM 类型,它们的名称很难记住、又长又笨重,所以如果可以避免的话,我宁愿在从对象进行转换时不必键入它们。使用 Seq.cast 它将推断所需的类型并根据需要进行强制转换。 这是一个用
假设您不关心编译器和机器的转换风格,以下之间是否存在明显差异: #include #include #include static int64_t tosigned (void *p) {
我的测试类 XString 有两个转换运算符。但是编译器不会为 fooA 使用显式转换 operator const wchar_t*()。为什么? class XString { public:
我有以下代码: T imageCollectionItem; // This checks if image actually exists, if it doesn't it gets the ne
这有点假设,因为我不太担心性能 - 只是想知道一般来说哪个选项实际上最快/最有效,或者是否没有任何区别。 假设我有以下支持重载的访问者模板代码: #define IMPLEMENT_VISITOR_W
我目前正在存储复选框的真/假状态。在注册表中检查值以在下次加载表单时重置。 加载表单时,我获取值并像这样设置复选框。 string value = (string)Registry.GetValue(
enum Gender { Male, Female } var k = new[] { Gender.Male }.Cast().ToList().Cast().ToList(); //alrigh
我正在按照 https://codelabs.developers.google.com/codelabs/cast-receiver#0 上的教程构建一个 chrome cast 自定义接收器。我无
我看不懂以下作品 SELECT price, CAST(price AS DECIMAL(10,2)) FROM orders; 但是更新失败: UPDATE orders SET price = C
在 Cast v3 中,如何手动更改“停止转换”按钮的颜色? 我可以为其他所有内容更改转换对话框或媒体路由器的样式,但“停止转换”按钮似乎会根据背景颜色切换为黑色/蓝色。 我的主题:
我是一名优秀的程序员,十分优秀!