最近我对访谈提出了一个问题 - 我被要求比较性能方面的按位操作.
比如,简要描述不同位操作的性能.
我想这个问题可能非常普遍且非常适合机器,但我也认为应该有一些关于此的一般规则,你必须提到(我没有:).
那么 - 你会回答什么?
我可能还应该说,在C (或C++,无论如何)中比较它们的性能可能是个好主意,因为我认为这些语言为编译器提供了更多空间来执行与位相关的优化.
谢谢.
好的,完整的问题背景.
采访有几个部分,其中一些真的是小菜一碟,有些是噩梦.与位相关的部分很难,包括以下问题:
浮点数规格float,double
快速float- > int转换(如果你知道范围,甚至更快)
那些并不是很难,但作为这个与位相关的部分中的最后一个问题,我被要求列举我所知道的位操作并比较它们的性能.
我回答了一些不太像描述性的东西,比如"它的架构,编译器,......具体,它实际上并不重要,按位已经非常低级",但我猜这个答案很糟糕.
通过名称调用某个方法的方法是什么,比如"Method1",如果我有一个Object,那就是它Type?
我想做这样的事情:
Object o;
Type t;
// At this point I know, that 'o' actually has
// 't' as it's type.
// And I know that 't' definitely has a public method 'Method1'.
// So, I want to do something like:
Reflection.CallMethodByName(o, "Method1");
Run Code Online (Sandbox Code Playgroud)
这有点可能吗?我确实意识到这会很慢,这很不方便,但不幸的是,在我的情况下,我没有其他方法可以实现这一点.
(这个问题是C#访问派生类中受保护成员的后续行动)
我有以下代码片段:
public class Fox
{
protected string FurColor;
private string furType;
public void PaintFox(Fox anotherFox)
{
anotherFox.FurColor = "Hey!";
anotherFox.furType = "Hey!";
}
}
public class RedFox : Fox
{
public void IncorrectPaintFox(Fox anotherFox)
{
// This one is inaccessible here and results in a compilation error.
anotherFox.FurColor = "Hey!";
}
public void CorrectPaintFox(RedFox anotherFox)
{
// This is perfectly valid.
anotherFox.FurColor = "Hey!";
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们知道私有和受保护的字段是私有的并且受类型保护,而不是实例.
我们也知道访问修饰符应该在编译时工作.
所以,这里有一个问题 - 为什么我不能访问类实例的FurColor字段?FoxRedFox RedFox …
我该如何处理以下情况:
我正在编写自己的2D矢量类,并具有以下代码:
class Vector2 : public (...)
public:
Vector2(float x, float y) {
local_vector_storage_[0] = x;
local_vector_storage_[1] = y;
}
template <typename Iterator> Vector2(Iterator begin, Iterator end) {
ASSERT(end - begin == 2);
resize(2);
std::copy(begin, end, local_vector_storage_.begin());
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我说它Vector2 v(3.0f, 4.0f);编译好并调用适当的float构造函数.
但是,如果我写Vector2 v(3, 4);它失败,因为模板化的迭代器构造函数"更适合"并被Vector2(Iterator(3), Iterator(4))调用.
在这种情况下我该怎么办?
我的想法是引入assign(It1, It2)成员方法而不是构造函数,但也许有更好的解决方案?
另外,你怎么看待ASSERT(end - begin == 2)线?我知道这意味着我不能,例如,传递迭代器std::list,但带来额外的安全性.我应该这样做吗?
许多映射技术(包括法线凹凸贴图,视差贴图等)都需要特殊的每顶点切线空间(切线,法线,副法线/比特).
这显然意味着,我的模型不仅要出口的顶点位置,纹理坐标和每个顶点的法线近似,而且切空间的基向量(通常是一个tangent),因为另外一个可以直接在着色器中使用cross(tangent, normal).
请注意,position,normal,uv和tangents实际上是以下列方式相互依赖的(您必须知道关于顶点的所有其他内容以准备切线基础).
position -> normal -> tangents
uv ->
Run Code Online (Sandbox Code Playgroud)
现在 - 在现代3D游戏/渲染引擎中如何处理这类事情?
它们实际上是为每个顶点提供法线,切线和uv坐标还是可以在运行时以某种方式计算它们?它们应该是模型数据的一部分还是应该是仅运行时属性?
我也知道,当使用Direct3D10+几何着色器时,实际上可以在运行时准备法线和切线(显然,因为我们可以访问每个三角形中的顶点) - 是否值得或者这些东西是否应该总是预先计算?
我有以下代码示例:
public interface IRepository {
// Whatever
}
public class SampleRepository : IRepository {
// Implements 'Whatever'
}
public class NHibernateRepository : IRepository, IDisposable {
// ...
public void Dispose() { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在 - 真的很糟糕吗?我不确定,但这似乎与不标记虚拟基类的析构函数C++相同.
我不想让IRepository接口实现IDisposable,因为这会带来不必要的复杂性和一堆必须实现的类IDisposable.
该案件应如何处理?
我确信这可能发生在任何类型层次结构中 - 当派生类型之一必须管理可支配资源时.
那么我应该怎么做 - 将其拉到IDisposable第一个界面或保留它并希望用户区分一次性和非一次性存储库?
谢谢.
有人可以指出为什么会发生这种情况:
我正在使用它NHibernate和Linq它的提供者.
此处列出了失败的代码:
var sequence = session.Query<T>();
var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);
Run Code Online (Sandbox Code Playgroud)
调试显示sequence(IQueryable<T>之后)包含2个元素,这些元素已添加到数据库中.
我希望第一个Where语句产生该序列中的所有元素,但不幸的是它留下了0个元素.
Where相反,第二个陈述实际上产生了2个元素,因为它应该起作用.
以下是NHibernate -> Sqlite第一个和第二个Where语句的查询.
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)]
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)]
Run Code Online (Sandbox Code Playgroud)
现在,如果我用my测试相同的代码InMemoryRepository,它将每个实体存储在一个简单的列表中,那么这个 …
GetHashCode如果我的对象被认为是相等的,如果它们中至少有一个字段匹配,那么覆盖该情况的函数的最佳方法是什么.
在泛型Equals方法的情况下,示例可能如下所示:
public bool Equals(Whatever other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
// Considering that the values can't be 'null' here.
return other.Id.Equals(Id) || Equals(other.Money, Money) ||
Equals(other.Code, Code);
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我GetHashCode对这个案例的良好实施感到困惑.
该怎么做?
谢谢.
我正在使用SSE2内在函数来优化我的应用程序的瓶颈,并提出以下问题:
ddata = _mm_xor_si128(_mm_xor_si128(
_mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata);
Run Code Online (Sandbox Code Playgroud)
在Microsoft C++编译器上,这将无法编译,因为类型__m128i和unsigned int(传递给_mm_sll_epi32指令)不可互换.
为什么会这样,我应该如何传递任意unsigned int值_mm_sll_epi32?
_m128i 是:
typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
__int8 m128i_i8[16];
__int16 m128i_i16[8];
__int32 m128i_i32[4];
__int64 m128i_i64[2];
unsigned __int8 m128i_u8[16];
unsigned __int16 m128i_u16[8];
unsigned __int32 m128i_u32[4];
unsigned __int64 m128i_u64[2];
} __m128i;
Run Code Online (Sandbox Code Playgroud) 我正在通过开发现有应用程序的扩展 COM.
要扩展的应用程序的当前接口允许创建自定义属性窗口并在该应用程序内使用它们.
现在,我正在使用.NET这个目的,并有一些奇怪的问题:
extensionForm = new Form();
extensionForm.SetBounds(0, 0, 100, 100);
extensionForm.Controls.Add(new Button());
ExApplAPI.AddCustomPropertyWindow(extensionForm.Handle.ToInt32(), "Ololo");
Run Code Online (Sandbox Code Playgroud)
正如你在下面看到的那样,属性表实际上已经扩展,但在那之后,一些奇怪的事情开始发生.

基本上,如果我切换到Ololo选项卡,然后返回到任何其他3个选项卡(Attributes,Drawing或Services),应用程序将冻结.我也知道冻结发生在一些非托管代码块中.
另一个有趣的事实是,如果我不写extensionForm.Controls.Add(new Button()) (有或没有暂停/恢复布局调用),一切正常.因此,如果最近构建的表单上没有控件(按钮或任何其他),则它不会冻结.
这是冻结之前窗口Spy++上的日志Ololo(最后一条消息是WM_CTLCOLORBTN,在应用程序冻结之后):

Ololo到其他选项卡然后Ololo再次切换到选项卡时才会发生冻结.那么 - 在这种情况下帮助我的任何想法/类似问题解决/等?
c# ×6
c++ ×3
.net ×1
3d ×1
bits ×1
com ×1
constructor ×1
disposable ×1
equals ×1
gethashcode ×1
interface ×1
intrinsics ×1
iqueryable ×1
lambda ×1
linq ×1
matching ×1
nhibernate ×1
normals ×1
object ×1
performance ×1
private ×1
properties ×1
protected ×1
reflection ×1
shader ×1
simd ×1
sse ×1
sse2 ×1
templates ×1
vector ×1
winapi ×1