- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在为 PowerPC 604 用嵌入式 C 编写实时软件.
接下来是我的两位同事之间的对话。我很难理解他们在说什么。
员工 1:
In the PPC architecture, must integer alignment follow word boundaries? This is related to whether the pointer stack math/comparisons might be better served as cast to integer pointers instead of char pointers. If PPC guarantees word alignment then seeing pointer values that are not word aligned seems it would be an additional check-able red-flag, whereas char pointers could by their nature be odd address values 3/4 of the time...just a thought that came to me...am I totally off-base?
员工 2:
Only floating point values must be on 4-byte aligned memory address. All other values do not have this requirement. This is why we have 4-byte alignment checks when parsing network packets (which can be at any byte offset in the packet as sent). WORD alignment is not guaranteed otherwise.
员工 1:
I probably didn't state my issue satisfactorily. In the PPC architecture pointers should generally have word boundary values unless they are pointing to values in a vector of characters. The architecture makes every effort to align all non-vector values to word boundaries. This allows for an additional corruption check such that if a pointer value is **not on a four byte boundary and does not point to an element in a packed struct then it probably means data has been corrupted...That was my only point.
员工 2:
I think you misunderstood my answer. Unless they changed it, which could very well be true, that it not the case. WORD alignment is not guaranteed and a check against WORD alignment tells us nothing. The corruption check would not be possible this way. I specifically looked this up in the old documentation several years ago, and they certainly could have changed it. We would need to find proof of this though. The only data type that is guaranteed to be placed on a word aligned memory address are floats and it's a compiler option, not an architecture requirement.
员工 1:
I've got "the proof" if you want to see it. unless the data is explicitly packed or is a char vector index it will reside at an address ending in [0,4,8,c] on PPC.
我很困惑。 vector ?他们一定是指数组。这些信息中有多少是有意义的,有多少是有问题的?
数据对齐和字边界的规则是什么?
他们试图确定什么?
最佳答案
I'm very confused. Vector? They must be referring to arrays.
通过“字符 vector ”,说话者似乎指的是 char
的连续序列/unsigned char
.这可能对应于一个 C 数组,但我怀疑他使用术语“vector ”是因为认识到 任何 连续内存块都可以被视为 char
的连续序列。 , 那一个 char *
可以指向任何 char
在这样一个序列中的任何地方。
What are the rules for data alignment and word boundaries?
它们因机器架构而异。这与 C 程序的关系是 C 实现的一个方面。在“托管”环境中,这是操作系统“应用程序二进制接口(interface)”(ABI) 的一个方面,但对于嵌入式系统,您可能正在使用“独立”C 实现,在这种情况下,ABI 并不是真正的东西-- 只有 C 实现本身。
What are they trying to determine?
考虑以下代码:
#include <stdint.h>
_Bool is_word_aligned(int anyint) {
return (((uintptr_t) &anyint) % sizeof(int) == 0);
}
正在讨论的主要问题大致等同于这个问题:“函数 is_word_aligned()
是否会返回错误结果?”。部分讨论假定系统的自然字长为 4 个字节,但我将字长写为 sizeof(int)
。 ;这种对应关系是 32 位系统的典型特征,但在任何地方都不能保证。 “字长”不是 C 的概念。
我还假设将指针值转换为整数类型会在进程的地址空间中产生相应的数字地址;这也是典型的,但不能保证。尽管如此,讨论者似乎也在做出这样的假设,否则 C 中就没有办法对他们正在谈论的地址执行各种测试。
双方承认char *
可能指向任何地址。如果 char
,则遵循 C 的规范对应于最小的可寻址存储单元,这也是典型的,但不能保证。这两名员工似乎在讨论执行内部一致性检查的现有代码。似乎现有代码执行从某些指针类型到 char *
的显式转换。 , 然后使用指针算法来寻址指向对象的各个字节。员工 1 建议改为 int *
,并假设如果机器架构和 C 实现需要 int
s 是字对齐的,然后代码可以将其添加为验证检查。
How much of this information makes sense, and how much of it is questionable?
就呈现的任何信息而言,该信息是可信的。员工 1 的提议是否明智是另一个问题。员工 2 认为它不是,因为大多数值不需要在底层机器体系结构上进行字对齐。这似乎是一个非常有力的论据。员工 1 观察到,在实践中,C 实现确实按字边界对齐存储,但很难知道这是否可以作为绝对规则来依赖。此外,如果有问题的原始指针在转换之前不是 int *
。 ,那么没有特别的理由将其视为将指针转换为 int *
的无效标志。产生不对应于字对齐地址的结果。
关于c - PowerPC 604 上的整数对齐和字边界规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276609/
我正在尝试学习 Fortran,并且看到了很多不同的定义,我想知道他们是否正在尝试完成同样的事情。以下有什么区别? 整数*4 整数(4) 整数(kind=4) 最佳答案 在 Fortran >=90
我以前从未编程过,最近(1 周前)才开始学习!第一门类(class)是函数式编程,使用 Haskell。 我有一项学校作业,我想通过删除一两个步骤来改进它,但我遇到了一个讨厌的错误。 基本上,我创建了
给定以下GraphQL请求和变量: 请求: query accounts($filter:AccountFilter, $first_:String, $skip_:Int) { accounts
我已经搜索了 StackOverflow,但找不到关于如何检查计算器应用程序的数字输入正则表达式的答案,该计算器应用程序将检查每个 keyup 的以下格式(jquery key up): 任何整数,例
类似于我上一篇致歉的文章,但没有那么长篇大论。基本上我想知道当每次重绘调用只重绘屏幕的一小部分时,优化重绘到 JFrame/JPanel 的最佳选择是什么。 此外,除了重绘重载之外,我并不是 100%
所以在我的教科书中有一个使用 f# 的递归函数的例子 let rec gcd = function | (0,n) -> n | (m,n) -> gcd(n % m,m);; 使用此功能,我的教科书
我有一个数据结构,例如表达式树或图形。我想添加一些“测量”功能,例如depth和 size . 如何最好地键入这些函数? 我认为以下三个变体的用处大致相同: depth :: Expr -> Int
这样写比较好 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Inte
我是 Java 8 新手,想根据键对 Map 进行排序,然后在值内对每个列表进行排序。 我试图寻找一种 Java 8 方法来对键和值进行排序。HashMap>映射 map.entrySet().str
这就是我的目标... vector ,int> > var_name (x, pair (y),int>); 其中 x 是 vector var_name 的大小,y 是对内 vector 的大小。
这里是 an answer to "How do I instantiate a Queue object in java?" , Queue is an interface. You can't i
这个问题在这里已经有了答案: Weird Integer boxing in Java (12 个答案) Why are autoboxed Integers and .getClass() val
我们可以使用 C++ STL 做这样的事情吗?如果是,我将如何初始化元素?我试图这样做,但没有成功。 pair,vector>p; p.first[0]=2; 最佳答案 Can we do som
您好,我正在尝试为百分比和整数数组中的数字找到索引。假设 arraynum = ['10%','250','20%','500'] 并且用户发送一个值 15%,这个数字在哪个范围内居住?我可以使用这段
我与三列有关系:ProductName、CategoryID 和 Price。我需要选择仅那些价格高于给定类别中平均产品价格的产品。(例如,当apple(ProductName)是fruit(Cate
我已经坚持了一段时间,我正在尝试将一些数据配对在一起。这是我的代码。 #include #include using namespace std; int main() { pair data(
我收到错误:'(Int, Int)' 与 'CGPoint' 不相同 如何将 (Int, Int) 转换为 CGPoint let zigzag = [(100,100), (100,150)
我在 .cpp 文件中发现了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与 Android NDK 相关。但是,我认为这个问题是关于 C++ 语法的一般问题。这些在某种程度上
我将这些输入到 Scala 解释器中: val a : Integer = 1; val b : Integer = a + 1; 我收到消息: :5: error: type mismatch;
C++:vector>v(size);当我试图打印出值时显示 0 作为值,但是当未声明 vector 大小时它显示正确的输出?为什么这样?例如: int x; cin>>x; vector>v(x);
我是一名优秀的程序员,十分优秀!