我正在打包SDK发行版的示例代码.在分发中,从代码到SDK程序集的相对路径与构建机器不同.例如:
分配
csharp/bin/assembly.dll
example/ex1/ex1.csproj
Run Code Online (Sandbox Code Playgroud)
构建机器
foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj
Run Code Online (Sandbox Code Playgroud)
假设我无法移动任何东西.有没有办法可以指导ex1.csproj两者兼顾
../../csharp/bin/ 并 ../../../../foo/sdk/csharp/bin/为assembly.dll?
在C++中,我将依赖路径放在一个独立的属性表中,并使用SDK分发不同的版本.但是C#没有属性表,我不想维护整个项目的两个版本.
我已经看到这个问题表明我不能使用多个<HintPath>标签,所以我正在寻找另一种方法来近似相同的行为.
class C
{
public:
void foo() const {}
private:
void foo() {}
};
int main()
{
C c;
c.foo();
}
Run Code Online (Sandbox Code Playgroud)
MSVC 2013不喜欢这样:
> error C2248: 'C::foo' : cannot access private member declared in class 'C'
Run Code Online (Sandbox Code Playgroud)
如果我转向const参考,它的工作原理:
const_cast<C const &>(c).foo();
Run Code Online (Sandbox Code Playgroud)
为什么我不能const在非const对象上调用该方法?
对于可以包含全部size_t值的签名类型,是否有标准(或MSVC专有)typedef ?即在64位系统上,它将是一个128位有符号整数.
假设我有以下代码
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成的代码解除引用p的vtable条目是virtualMethod1次还是1000次?我正在使用Microsoft的编译器.
编辑
这是我正在查看的真实世界案例的生成程序集. line->addPoint()是虚拟的关注方法.我没有装配经验,所以我慢慢地过去了...
; 369 : for (int i = 0; i < numPts; ++i)
test ebx, ebx
je SHORT $LN1@RDS_SCANNE
lea edi, DWORD PTR [ecx+32]
npad 2
$LL3@RDS_SCANNE:
; 370 : {
; 371 : double *pts = pPoints[i].SystemXYZ;
; 372 : line->addPoint(pts[0], pts[1], pts[2]);
fld QWORD PTR [edi+8]
mov eax, DWORD PTR …Run Code Online (Sandbox Code Playgroud) 在MSVC 2013中编译以下代码,64位版本构建,/O2优化:
while (*s == ' ' || *s == ',' || *s == '\r' || *s == '\n') {
++s;
}
Run Code Online (Sandbox Code Playgroud)
我得到了以下代码 - 使用64位寄存器作为带有bt(位测试)指令的查找表,它具有非常酷的优化.
mov rcx, 17596481020928 ; 0000100100002400H
npad 5
$LL82@myFunc:
movzx eax, BYTE PTR [rsi]
cmp al, 44 ; 0000002cH
ja SHORT $LN81@myFunc
movsx rax, al
bt rcx, rax
jae SHORT $LN81@myFunc
inc rsi
jmp SHORT $LL82@myFunc
$LN81@myFunc:
; code after loop...
Run Code Online (Sandbox Code Playgroud)
但我的问题是:movsx rax, al第一个分支后的目的是什么?
首先,我们从字符串中加载一个字节rax并对其进行零扩展:
movzx eax, BYTE …Run Code Online (Sandbox Code Playgroud) 我刚才注意到了一些我以前从未意识到的东西.事实证明这个类在C#中是有效的:
class Foo
{
private string contents;
public Foo(string str) {
contents = str;
}
public void set(Foo other)
{
contents = other.contents;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,同一类的不同实例可以访问彼此的私有成员.
直到现在,我认为对象的私有成员只能被该对象访问,而不能被同一类的其他实例访问.发现这一点有点令人惊讶.
所有常见的面向对象语言都是这种情况吗?这对我来说并不直观.
#include <vector>
struct C
{
std::vector<int> v;
decltype(v.begin()) begin() { return v.begin(); }
decltype(v.end()) end() { return v.end(); }
};
Run Code Online (Sandbox Code Playgroud)
Clang ++没有问题,但是MSVC 2013给出了以下错误:
error C2228: left of '.begin' must have class/struct/union
Run Code Online (Sandbox Code Playgroud) 以下SVG文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="400" height="400">
<g transform="translate(200, 200)">
<text text-anchor="middle" dominant-baseline="text-after-edge">Why don't I move?</text>
</g>
</svg>
Run Code Online (Sandbox Code Playgroud)
如果我改变呈现在Internet Explorer 10.0完全相同text的dominant-baseline属性text-before-edge.
在Chrome 38.0中,它会像我预期的那样移动.
该演示页面应该说明所有不同的dominant-baseline设置.它也适用于Chrome,但所有文本块都显示在IE中的相同y位置.
但是,这个Microsoft文档使得它看起来甚至IE 9都支持该属性.
我的SVG文件(和演示文件)是否会使IE无效,或者我是否需要使用我的布局手动执行此操作?
我正在生成以绝对坐标布局的文件,因此如果我需要停止使用此基线属性并自行进行偏移,这不是一个大问题.
我一直听说在Windows中创建新进程非常昂贵.但我找不到确切的数字.是否有一个球场周期数?2GHz双核处理器上多少毫秒?
我用Python编写了一个测试程序,每个进程测量5ms,但我不知道有多少是Python的额外开销.我猜不多.
常见的编译器优化是将尾递归函数转换为循环,从而加快执行时间并减少内存(堆栈)消耗:
int go_to_zero( int n )
{
if( n == 0 )
return 0;
else
return go_to_zero( n - 1 );
}
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:在模板元编程上执行尾递归算法是否有任何性能优势(即减少编译时间)?
这是一个例子:
template<typename... Ts>
struct list {};
template<typename LIST>
struct reverse;
template<typename HEAD , typename... TAIL>
struct reverse<list<HEAD,TAIL...>>
{
using result = concat<typename reverse<list<TAIL...>>::result,list<HEAD>>;
};
template<>
struct reverse<list<>>
{
using result = list<>;
};
Run Code Online (Sandbox Code Playgroud)
与:
template<typename INPUT , typename OUTPUT>
struct reverse_impl;
template<typename HEAD , typename... TAIL , tyename... Ts>
struct reverse_impl<list<HEAD,TAIL...>,list<Ts...>>
{
using result = typename …Run Code Online (Sandbox Code Playgroud)