我需要能够获取4个打包整数,并使用或操作将它们一个堆叠在一起,形成一个组合整数.
最有效的方法是什么?注意,打包整数中的1将永远不会有一个共同的位置,所以我认为无符号的"添加"也可以做到这一点.
我看到了水平添加指令,但它是用于签名添加的.
这本质上是我的问题.在函数的生命周期中,我生成一些整数,然后在算法中使用整数数组,该算法也是同一函数的一部分.整数数组只能在函数中使用,因此将数组存储在堆栈中自然是有意义的.
问题是我不知道数组的大小,直到我完成生成所有整数.
我知道如何在堆栈上分配固定大小和可变大小的数组.但是,我不知道如何在堆栈上生成数组,这似乎是解决我的问题的最佳方法.我相当确定这可以在汇编中完成,你只需增加堆栈指针并为每个生成的int存储一个int,因此int数组将位于堆栈帧的末尾.这可能在C中做到了吗?
所以我对分支的理解是有两种类型:
双向分支,根据存储在寄存器中的某些计算的结果进行分支。昂贵并导致管道冲洗。
单向分支,这就像一个函数指针或一个 goto,它将转到常量地址。如果我弄错了,请纠正我,但我认为这比两个分支便宜得多,因为现代处理器将在管道的早期解决这些指令。
我想象如果存在第三种类型的分支,循环展开会更快。通常,循环展开会增加指令大小,但会避免双向分支。如果您有一个分支,它同时支持指令大小和两个分支,该怎么办。就像一个分支,它会循环一段代码恒定的次数。
存在哪些类型的分支?
我设置了一个c ++项目来在visual studio中使用DLL.该库有.h .lib和.dll文件.该程序编译并运行,并成功使用该库.DLL放在源的根目录中,而不是输出目录中.当我构建时,我希望将DLL从源代码复制到输出目录,但事实并非如此.我在输出目录中看到的只有3个类型,应用程序,增量链接器文件和程序调试数据库的文件.
也许我错了,但我认为DLL需要与输出目录中的可执行文件位于同一文件夹中.发生什么了?
如果无法修改包装类,则包装类很好.使用包装器,我可以添加某些功能和方便,我仍然可以通过使用从包装器到包装类型的隐式转换,使用包装类型的函数接受包装器.像这样的东西:
struct vec {
__m128 m128;
inline operator __m128 &() {
return m128;
}
//convenience to add functionality related to the wrapped variable inserted here
}
Run Code Online (Sandbox Code Playgroud)
这很好用.
现在我的问题是,当你无法访问包装类型的源或无法修改它时,你可以隐式地转换从__m128到vec的另一种方式吗?
我有一个像这样的矢量的属性
public Vector2 TestVector
{
get { return testvector; }
set
{
testvector = value;
}
}
Run Code Online (Sandbox Code Playgroud)
Vector2有成员X和Y.
当我想将property.x和property.y设置为值时,它不起作用
// this does not work
TestVector.X = 10;
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
编辑:我看到我得到的答案说它是一个结构,但实际上我有一个名为dVector2的组合类,它是一个类类型而不是结构,我使用它.为了简单起见,我只把vector2放在这里,但这种情况适得其反.
例:
public class BoundingBox
{
public Vector3Double Positon { get; set; }
public Vector3Double Apothem { get; set; }
public ExtremasForX X;
public BoundingBox(Vector3Double position, Vector3Double size)
{
Positon = position;
X = new ExtremasForX(this);
}
private class ExtremasForX
{
private BoundingBox box;
public ExtremasForX(BoundingBox box)
{
this.box = box;
}
public double Max
{
get { return box.Positon.X + box.Apothem.X ; }
}
public double Min
{
get { return box.Positon.X - box.Apothem.X; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码生成可访问性错误:BoundingBox.X的级别高于其类型.
我想要一个没有公共构造函数的内部类,因为我只希望将该类用作外部类的命名空间.我该怎么做?
考虑以下
public byte GetAByte()
{
return (byte)(_globalByte % 13);
}
Run Code Online (Sandbox Code Playgroud)
请注意,以下内容不起作用并引发错误.
return (_globalByte % (byte)13);
Run Code Online (Sandbox Code Playgroud)
这里mod运算符返回一个整数,需要将其转换回一个字节以使return语句起作用.如果我错了,请纠正我,但我猜测_globalByte在计算模数之前被转换为整数.总的来说,这意味着2次铸造操作.
所以我的问题是为什么基本运算符每次都必须返回一个整数?这是一个特定于java的怪癖,还是以这种方式做到这一点有一些重要性?
所以根据c ++规范
E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有有符号类型和负值,则生成的值是实现定义的.
所以它是实现定义的,但是如果我使用的是一个针对x86平台的无错误编译器,并且使用有符号类型进行右移,是否有任何理由怀疑我不会移位有符号位?(x86显然支持算术移位)
“Scala 有函数和部分函数文字的语法。它看起来像这样”:
{
case pattern if guard => statements
case pattern => statements
}
Run Code Online (Sandbox Code Playgroud)
它是如何工作的,在什么情况下你可以创建一个带有括号{}而不是箭头的函数文字=>?