- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
前段时间我创建了一个简单的模拟计算机。它有外围设备、可以渲染为 OpenGL 纹理的屏幕缓冲区,以及其他一些简洁的功能。它运行良好,运行良好,总的来说我很满意。
除了,我作弊了。
底层数据类型是整数、 float 和指令类型的 union (拆分为位字段)。
对于任何正确的(模拟的)程序, union 总是被安全地使用,只从写入的最后一个 union 成员读取。但是,格式错误的程序(例如从模拟硬盘驱动器加载)可能会乱序访问成员,这可能会使我面临与 union 滥用相关的常见问题:
考虑的解决方案:
我想这是许多 SO 用户曾经或多次尝试过的项目,因此特别欢迎有特定问题的经验。
最佳答案
如果您的编译器支持,您可以使用 C++17 std::variant
(基于 boost::variant
)。
编辑:为了最大限度地节省空间,选择加入类型的安全性,您可以按照以下方式做一些事情
union Word { int32_t i; float f; Instruction inst; };
namespace MemAccess
{
static std::bitset<MEM_SIZE> int32_whitelist,
float_whitelist,
inst_whitelist;
static std::array<Word, MEM_SIZE> memory;
// set or reinterpret as int32
int32_t &
int32_at(const size_t at)
{
int32_whitelist[at] = 1;
float_whitelist[at] = inst_whitelist[at] = 0;
return memory[at].i;
}
// interpret as int32 only if whitelisted
int32_t &
int32_checked(const size_t at)
{
if (int32_whitelist[at])
{
return memory[at].i;
}
else
{
throw;
}
}
// equivalent functions for floats and instructions
}
编辑 2:我发现这也可以用一个位集来完成。
static std::array<Word, MEM_SIZE> memory;
static std::bitset<MEM_SIZE * 2> whitelist;
float &
float_at(const size_t at)
{ // None = 00, Inst = 10, Int32 = 11
whitelist[at * 2] = 0;
whitelist[at * 2 + 1] = 1;
return memory[at].f;
}
float &
float_checked(const size_t at)
{
if (!whitelist[at * 2] && whitelist[at * 2 + 1])
{
return memory[at].f;
}
throw;
}
关于c++ - 简单虚拟机安全、高效的底层数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338875/
我有以下功能: function addChange(result, bill) { for (var i=0;i
这是网站: www.wearethefirehouse.com/phasetest 如果您慢慢滚动,您会注意到一旦菜单栏完全不透明,nav li 元素就会全部从 Enzo 300 跳起来(如在没有导航
美好的一天。对于当前的项目,我需要知道数据类型如何表示为字节。例如,如果我使用: long three = 500;var bytes = BitConverter.GetBytes(three);
请解释 JVM 是如何在底层收集 ThreadDump 的。 我不明白它如何收集脱离 CPU 的线程的堆栈跟踪(等待磁盘 IO、网络、非自愿上下文切换)。 例如,linux perf 仅收集有关 on
开始学习 R,如果能帮助我理解 R 如何决定不同向量的类别,我将不胜感激。我初始化 vec <- c(1:6)当我执行 class(vec)我得到“整数”。为什么它不是“数字”,因为我认为 R 中的整
我有一个透明的 UIView,几乎覆盖了整个屏幕。我在顶部留下了 50 像素。它是 View Controller View 的 subview 。 在UIView下面有一个继承自UIView的MyV
我很好奇对象是如何在 Nodejs 中显示的,在本例中是 Promise。使用 console.log(promiseObject) 时,输出的类型为 {状态:待处理} 这对我来说似乎很奇怪,因为在该
当您在 Windows Azure 中使用表服务 API 时,幕后到底在做什么?我想我在某处读到这没有使用 SQL Server。它是否执行哈希表,然后过滤器真的像映射/减少操作一样运行?我对这些东西
如何查看函数 concat 中的代码?它是如何做的?有没有人有代码的副本或在浏览器控制台中查看它的方法? console.dir 不给我访问权限 console.dir(Array.prototype
我是 C++ 的新手,所以如果这个问题的答案显而易见,我深表歉意。 我一直在编写 STL 样式的自定义数据结构,以此来提高我的技能。 (我实际上也确实需要这种结构,但出于学习目的,我有点过分了。) 此
我正在尝试使用 log4j appender 将日志发送到 GrayLog2 (log4j2-gelf)。所以我将我的依赖项添加到我的 pom.xml 配置 log4j2.xml 来配置我的 appe
我正在使用带有 vector 的 priority_queue 作为底层容器。但是我希望堆的大小非常大。我知道动态 vector 容量调整大小的问题。所以我正在寻找方法来为我的priority_que
我有一个 SqlDataAdapter,它填充了 21 行数据(4 列)。驱动它的 sproc 在几秒钟内在 SQL Mgmt Studio 中返回,但 .Fill() 需要 5 分钟。 Ar
我想实现一个屏幕控制按钮,按下它可以作为 GUI 交互的修饰符。 这对于 MouseArea 是不可能的,因为该 API 只能处理一个鼠标区域中的一个触摸点。 该限制不适用于 MultiPointTo
我试图将图像和 div 层置于包含 div 的中心,但到目前为止我无法让它从列的左侧移动。我尝试了几种不同的方法,但就是无法让它移动。即使 margin auto 技巧也不起作用,我怀疑这是因为 bo
需要明确的是,我不是在询问 HDFS 中的权限设置,而是在 ext3 中或在 HDFS 运行于其上的各个数据节点机器上使用的任何文件系统中。 p> 我知道我们设置了 sudo chown hduser
我在服务器上创建了一个枚举,其中手动设置了整数值,而不是默认从 0 开始递增 public enum UserType { Anonymous = 0, Customer = 10,
如果显示框架图像,我们能否使以下 Google map 具有交互性。 Vie
我有一个顶部有自定义状态栏的布局 [在 Apple 的状态栏下方],然后是 UIScrollview 在中间部分从左到右分页,然后我有一个 UIView 底部有一些自定义按钮。一个简单的三 Pane
事情是这样的。我有一个 MVC 操作,在该操作上,我应用了自定义 ActionFilterAttribute 来使反序列化工作。现在,我想要做的是根据在此 View 中设置的 ViewBag.Titl
我是一名优秀的程序员,十分优秀!