- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
自从我使用 MSVC 2013 以来,我的应用程序在执行以下代码时崩溃了(稀疏矩阵乘以 vector ,伪代码:A = this * pVector):
complex<double> x = (A.getValue(lRow) + (mValues[lIdx] * pVectorB->getValue(lCol)));
之前我用的是MSVC 2005,应用运行的很好。
抛出异常 ( First-chance exception at 0x000000014075D1D2 in psc64.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
)。
我跟踪 assembly 到:
addpd xmm6, xmmword ptr [rax+rbx*8]
它只在优化/O2(最大化速度)时崩溃,但在没有优化/Od 时不会崩溃。
我也可以避免在方法pVectorB->getValue(lCol)
中添加代码(cout<<“bla bla”)时发生崩溃。 .
我相信这可能是未初始化变量的问题。但我找不到任何。因此,我研究了反汇编。
我检查了XMM6和ptr [rax+rbx*8]。它们在没有崩溃(cout<<"bla bla")和崩溃的情况下是一样的。
除了 XMM6 和 ptr [rax+rbx*8] 的值之外,还有什么我应该寻找的吗?
我很长一段时间以来一直在寻找问题,但找不到任何提示来追踪问题到我必须更正的代码行。
非常感谢任何帮助。谢谢。
获取值的代码:
<pre><code>template <class T> class Vector
{ const T& getValue(const int pIdx) const
{
if(false == checkBounds(pIdx)){
throw MathException(__FILE__, __LINE__, "T& Vector<class T>::getValue(const pIdx): checkBounds fails pIdx = %i", pIdx);
}
return mVal[pIdx];
}
bool checkBounds(const int pIdx)const
{
bool ret = true;
if(pIdx >= mMaxSize){
DBG_SEVERE2("pIdx >= mMaxSize, pIdx = %i, mMaxSize = %i", pIdx, mMaxSize);
ret = false;
}
if(pIdx < 0){
DBG_SEVERE1("pIdx < 0, pIdx = %i", pIdx);
ret = false;
}
return ret;
}
}
</code></pre>
配置mVal
:
<br/>
<pre><code>void* lTmp= calloc((4 * sizeof(complex<double>))+4, 1);
((char*)lTmp)[0] = 0xC;
((char*)lTmp)[1] = 0xC;
((char*)lTmp)[(4 * sizeof(complex<double>)) + 2] = 0xC;
((char*)lTmp)[(4 * sizeof(complex<double>)) + 3] = 0xC;
mVal= (void*)(((char*)lTmp) + 2)
</code></pre>
解决方案:
正如所建议的那样,它可以在所需数组前后没有 2 个字节的情况下工作 ( mVal
)。但它也适用于数组前后 16 字节的倍数。
最佳答案
当对 SSE 指令使用内存操作数时,如 addpd xmm6, xmmword ptr [rax+rbx*8]
内存操作数必须对齐。存在未对齐的load指令:您可以从[rax+rbx*8]
movdqu
然后对寄存器进行操作。但是如果使用内存形式,对齐就很重要了。优化标志可能改变了数组的对齐方式。或者它可能已将负载折叠到内存操作数(在某些情况下更快)并以这种方式导致问题。
关于c++ - MSVC 2013 : crash at addpd xmm6, xmmword ptr [rax+rbx*8],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21510945/
我有一个基于 python 的网络服务器在我的树莓派上运行,该服务器网络抓取 Roblox 上的交易货币汇率。如果你不知道我刚才说的是什么,你只需要知道我正在收集某个网页上变化的数字。我想将这些收集到
最新版本的 gcc 正在生成对我来说没有意义的程序集。我没有使用优化编译代码;但是,即使没有优化,此代码的某些部分也没有意义。 这是C源代码: #include int main()
我正在尝试使用 gcc 编译器在 Linux 下编译此代码: static inline unsigned long get_current(void) { unsigned long cur
我正在尝试使用 gcc 编译器在 linux 下编译此代码: static inline unsigned long get_current(void) { unsigned long cur
关注后 railstutorial.org我正在尝试运行 bundle install .它列出了 gem 的使用,例如: Using railties (3.0.7) Using rails (3.
我正在研究 8086/8080 微处理器。其中使用的寄存器有名称, RAX RBX RCX RDX 当寄存器被命名为 R8、R9... 到 R15 时,继续直到 R8。我想知道 我们是否也将寄存器 R
我正在编写一个 gem,我的目标是 Ruby、JRuby 和 Rubinius。我正在使用 Travis CI 来构建我的库。当我以 Ruby 和 JRuby 为目标时,我的 gem 构建正确,但以
自从我使用 MSVC 2013 以来,我的应用程序在执行以下代码时崩溃了(稀疏矩阵乘以 vector ,伪代码:A = this * pVector): complex x = (A.getValue
x64 寄存器是否可以互换,从某种意义上说,使用它们的一种组合的任何指令都可以与其他任何组合一起使用?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同? 最佳答案 不是。虽然大多数 x8
我想学习汇编,来自 C 一本书建议尝试实现这个算法,这是一个非常简单的排序算法 begin for i = 0 to len-1 small = arr(i) index = i
这个问题已经有答案了: What do the E and R prefixes stand for in the names of Intel 32-bit and 64-bit registers
我正在编写 Rust 代码,需要获取当前存储在“ebx”寄存器 (x86) 中的值。 我的代码 [0] 如下所示: #![feature(asm)] fn main() { let ebx:
这个问题在这里已经有了答案: How can you pull a value from a register? (1 个回答) 关闭 9 年前。 假设我想从双核 x64 CPU 上的那些寄存器(以
我是一名优秀的程序员,十分优秀!