该代码以四种方式转换矩阵.第一个是顺序写入,非顺序读取.第二个是相反的.接下来的两个是相同的,但缓存跳过写入.似乎发生的是顺序写入更快,并且跳过缓存更快.我不明白的是,如果跳过缓存,为什么顺序写入仍然更快?
QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
for (j = 0; j < N; ++j)
tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 1:\t%ld\n", after.QuadPart - before.QuadPart);
QueryPerformanceCounter(&before);
for (j = 0; j < N; ++j)
for (i = 0; i < N; ++i)
tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 2:\t%ld\n", after.QuadPart - before.QuadPart);
QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
for (j = 0; j < N; ++j)
_mm_stream_si32(&tmp[i][j], mul2[j][i]);
QueryPerformanceCounter(&after);
printf("Transpose 3:\t%ld\n", after.QuadPart - before.QuadPart);
QueryPerformanceCounter(&before);
for …Run Code Online (Sandbox Code Playgroud) 我在一台机器上做了一些项目的工作,然后推送到github,在另一台机器上克隆并做了一些工作,然后推了推.然后我回到第一台机器做了一个pull.现在,第一台机器认为项目中的所有文件最初都已更改.我试过了
git checkout -f --
Run Code Online (Sandbox Code Playgroud)
和
git rm --cached -r .
git checkout -f
Run Code Online (Sandbox Code Playgroud)
甚至尝试过
git stash
Run Code Online (Sandbox Code Playgroud)
但不管我做什么,git status告诉我那些文件已被更改.我怎么让它停下来?
在 vim 中,我可以点击[{返回到第一个未匹配的位置{或]}同样前进。有没有什么(短的)可以[}让我回到最后一个}?
在动态语言中,动态类型化代码JIT如何编译成机器代码?更具体地说:编译器是否在某些时候推断出类型?或者在这些情况下是否严格解释?
例如,如果我有类似下面的pseuocode
def func(arg)
if (arg)
return 6
else
return "Hi"
Run Code Online (Sandbox Code Playgroud)
在运行代码之前,执行平台如何知道函数的返回类型是什么?
我正在编写一个与大型(10-1000 GB)内存映射二进制文件交互的应用程序,基本上保存了一堆相互引用的对象.我想出了一种读取/写入这些数据的机制,这种机制既有效又丑陋(imo).
问:有没有更优雅的方式来实现我的目标?
我有结构化数据类型类一个,其中一个方法,它读取结构成一个Haskell数据类型(DataOp是一个ReaderT围绕IO).
class DBStruct a where
structRead :: Addr a -> DataOp a
Run Code Online (Sandbox Code Playgroud)
为了使这个更具可读性,我有另一个类型类定义了哪些结构成员去哪里:
class DBStruct st => StructMem structTy valTy name | structTy name -> valTy where
offset :: structTy -> valTy -> name -> Int64
Run Code Online (Sandbox Code Playgroud)
我有一些辅助函数,它们使用offset方法读取/写入结构元素,从存储的引用读取结构,以及延迟推迟结构读取(允许延迟读取整个文件).
这个问题是它需要大量重复才能使用.对于一个结构,我首先要定义Haskell类型:
data RowBlock = RowBlock {rbNext :: Maybe RowBlock
,rbPrev :: Maybe RowBlock
,rbRows :: [RowTy]
}
Run Code Online (Sandbox Code Playgroud)
那么name类型:
data Next = Next
data Prev = Prev
data Count = Count
newtype Row …Run Code Online (Sandbox Code Playgroud) 我已经看到QuickCheck如何用于测试monadic和非monadic代码,但是如何使用它来测试处理错误的代码,即打印一些消息然后调用exitWith?
如果我有代码
#include <tuple>
using Vec3 = std::tuple<float, float, float>;
using Vec3Ref = std::tuple<float&, float&, float&>;
void stuff ()
{
Vec3 foo (0,0,0);
Vec3Ref bar (foo);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误
/usr/include/c++/4.6/tuple:100:4: error: binding of reference to type 'float' to
a value of type 'const float' drops qualifiers
: _M_head_impl(std::forward<_UHead>(__h)) { }
^ ~~~~~~~~~~~~~~~~~~~~~~~~~
//snip...
/usr/include/c++/4.6/tuple:257:11: note: in instantiation of function template
specialization 'std::_Tuple_impl<0, float &, float &, float &>::_Tuple_impl
<float, float, float>' requested here
: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
^
18 : note: in …Run Code Online (Sandbox Code Playgroud) 在C++中,operator->具有特殊的语义,因为如果返回的类型不是指针,它将operator->再次调用该类型.但是,中间值通过调用表达式保持为临时值.这允许代码检测返回值的变化:
template<class T>
class wrapper
{
// ...
T val;
struct arrow_helper
{
arrow_helper(const T& temp)
: temp(temp){}
T temp;
T* operator->() { return &temp; }
~arrow_helper() { std::cout << "modified to " << temp << '\n'; }
};
arrow_helper operator->() { return{ val }; }
//return const value to prevent mistakes
const T operator*() const { return val; }
}
Run Code Online (Sandbox Code Playgroud)
然后T可以透明地访问其成员:
wrapper<Foo> f(/*...*/);
f->bar = 6;
Run Code Online (Sandbox Code Playgroud)
这样做会有什么问题吗?另外,有没有办法通过除以外的功能获得此效果operator->?
编辑:我遇到的另一个问题是表达式
f->bar = f->bar …Run Code Online (Sandbox Code Playgroud) 真实世界Haskell表示"变压器堆叠顺序很重要".但是,我似乎无法弄清楚ExceptT (ResourceT m) a和之间是否存在差异ResourceT (ExceptT m) a.他们会互相干涉吗?
假设Haskell的函数应用程序("空格"运算符)在类型类中而不是烘焙到语言中.我想它会看起来像
class Apply f where
($) :: f a r -> a -> r
instance Apply (->) where
($) = builtinFnApply#
Run Code Online (Sandbox Code Playgroud)
并且f adesugar to f $ a.这个想法是,这可以让你定义其他类似函数的类型,即
instance Apply LinearMap where
($) = matrixVectorMult
Run Code Online (Sandbox Code Playgroud)
等等.
这会使类型推断变得不可判定吗?我的直觉说它确实存在,但我对类型推断的理解停留在简单的Hindley-Milner.作为后续行动,如果它是不可判定的,可以通过禁止某些病态实例来判断它是否可以判定?