小编Rud*_*uis的帖子

为什么switch语句比Java 7中的String更快?

Java 7中,string对象可以是switch语句的表达式.有人可以从官方文档中解释以下声明吗?

Java编译器通常使用String对象生成比使用链式if-then-else语句更高效的字节码.

java if-statement switch-statement java-7

17
推荐指数
1
解决办法
1万
查看次数

MardownPad在Windows 10上崩溃

升级到Windows 10后,MarkdownPad 2不再起作用.预览窗口在启动时因"Awesomium"错误而崩溃.

在一周前提交错误报告后,我没有看到任何新的活动.我确实看到了一些关于安装Awesomium SDK的评论,并尝试了这条路线,但这会安装2个额外的程序(需要单独的管理/卸载),所以我不喜欢这个选项.

有没有人设法让MarkdownPad在Windows 10上运行,如果是这样,怎么样?

markdown

17
推荐指数
2
解决办法
7912
查看次数

包含std :: string的memset结构

我有一个庞大的结构,其中整个内容是标量变量,枚举和标量数组(基于堆栈),但一个std :: string变量除外.

现在,这是我的问题......

我可以将结构的整体大小设置为0(就像我只是所有标量一样),或者std :: string在那里是不可能的?我不确定memset会对其内部表示做什么.

如果你要说它的好/坏请解释原因 - 我想知道为什么它是这样的:)

c++

16
推荐指数
2
解决办法
6352
查看次数

在某些CPU的紧密循环中出现ADC/SBB和INC/DEC问题

我在Delphi中编写一个简单的BigInteger类型.它主要由TLimb的动态数组组成,其中TLimb是32位无符号整数,32位大小字段,它还保存BigInteger的符号位.

要添加两个BigIntegers,我创建一个适当大小的新BigInteger然后,在一些簿记之后,调用以下过程,将三个指针传递给左右操作数和结果的数组的相应开始,以及左右肢的数量分别为.

普通代码:

class procedure BigInteger.PlainAdd(Left, Right, Result: PLimb; LSize, RSize: Integer); 
asm
// EAX = Left, EDX = Right, ECX = Result
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        MOV     ESI,EAX                 // Left
        MOV     EDI,EDX                 // Right
        MOV     EBX,ECX                 // Result
        MOV     ECX,RSize               // Number of limbs at Left
        MOV     EDX,LSize               // Number of limbs at Right
        CMP     EDX,ECX
        JAE     @SkipSwap
        XCHG    ECX,EDX                 // Left and LSize should be largest
        XCHG    ESI,EDI                 // so swap
@SkipSwap:
        SUB     EDX,ECX                 // …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly

15
推荐指数
2
解决办法
919
查看次数

为什么这个计算在boost :: thread和std :: thread中给出不同的结果?

执行此浮点计算时boost::thread,它会产生与std::thread在主线程中或主线程中执行时不同的结果.

void print_number()
{
    double a = 5.66;
    double b = 0.0000001;
    double c = 500.4444;
    double d = 0.13423;
    double v = std::sin(d) * std::exp(0.4 * a + b) / std::pow(c, 2.3);

    printf("%llX\n%0.25f\n", *reinterpret_cast<unsigned long long*>(&v), v);
}
Run Code Online (Sandbox Code Playgroud)

这似乎是因为boost::thread默认情况下使用53位内部精度进行浮点数学运算,而主线程使用的是64位精度.如果在创建_fpreset()后重置FPU单元的状态boost::thread,则结果与主线程中的结果相同.

我正在使用Embarcadero C++ Builder 10.1(编译器bcc32c版本3.3.1)和Boost 1.55.0.我的环境是Windows 7,我正在构建32位Windows目标.

工作范例:

#include <tchar.h>
#include <thread>
#include <boost/thread.hpp>
#include <cstdio>
#include <cmath>
#include <cfloat>

namespace boost { void tss_cleanup_implemented() {} }

void print_number()
{
    double …
Run Code Online (Sandbox Code Playgroud)

c++ c++builder floating-accuracy boost-thread

14
推荐指数
2
解决办法
492
查看次数

将两个UInt32相乘以获得不扩展的UInt64

对于我的BigIntegers,在PUREPASCAL实现中(即不允许汇编程序),我必须乘以2 UInt32才能得到UInt64结果.

通常的方法是扩展至少一个操作数,所以你得到一个64位乘法:

Res := UInt64(A) * B;
Run Code Online (Sandbox Code Playgroud)

这里ResUInt64ABUInt32.

但是,在Win32中,这会产生一个相当笨重的机器代码:

MulTest.dpr.431: Res := UInt64(A) * B;
004DB463 8B45F8           mov eax,[ebp-$08]  // load A 
004DB466 33D2             xor edx,edx        // make it UInt64
004DB468 52               push edx           // push A
004DB469 50               push eax
004DB46A 8B45FC           mov eax,[ebp-$04]  // load B
004DB46D 33D2             xor edx,edx        // make it UInt64 
004DB46F E87C0AF3FF       call @_llmul       // 64 bit multiplication
004DB474 8945E8 …
Run Code Online (Sandbox Code Playgroud)

delphi

12
推荐指数
1
解决办法
462
查看次数

为什么我可以在btn为NIL时访问btn.Caption?

为什么这段代码不会崩溃?T没有.它是如何可以访问Caption是否Tnil

procedure Crash;                                                                          
VAR T: TButton;
begin
 T:= NIL;
 T.Caption:= ''; <---------- this works
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe7

11
推荐指数
1
解决办法
210
查看次数

从浮动到双重,从双重到浮动的精确损失?

float fv = orginal_value;  // original_value may be any float value
...
double dv = (double)fv;
...
fv = (float)dv;
Run Code Online (Sandbox Code Playgroud)

应该fv完全等于original_value吗?任何精度都可能丢失?

c c++ floating-accuracy

10
推荐指数
1
解决办法
7286
查看次数

不兼容的类型:'PAnsiChar'和'PWideChar'

我是delphi XE8的新手.我有以下代码来自我的delphi版本6,我想在delphi XE8中运行它.

1. function UTF8ToStringLen(const src: PChar; const Len: Cardinal): widestring;
2. var
3.   l: Integer;
4. begin
5.   SetLength(Result, Len);
6.   if Len > 0 then
7.   begin                                             
8.     l := MultiByteToWideChar( CP_UTF8, 0, src, Len, PWChar(Result), Len*SizeOf(WideChar));  <--error
9.     SetLength(Result, l);
10.   end;
11. end;
12. 
13. 
14. function StringToUTF8Len(const src: PChar; const Len: Cardinal): string;
15. var
16.   bsiz: Integer;
17.   Temp: string;
18. begin
19.   bsiz := Len * 3;
20.   SetLength(Temp, bsiz);
21.   if …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe8

8
推荐指数
1
解决办法
1万
查看次数

符号运算符号幅度大整数

我在Delphi中编写一个简单的BigInteger类型.此类型由无符号32位整数数组(我称之为四肢),计数(或大小)和符号位组成.数组中的值被解释为绝对值,因此这是符号幅度表示.这有几个优点,但有一个缺点.

像位运算and,or,xornot有补语义.如果两个BigIntegers都具有正值,则这是没有问题的,但是负BigIntegers 的大小必须通过否定转换为二的补码.这可能是一个性能问题,因为如果我们这样做,比方说

C := -A and -B;
Run Code Online (Sandbox Code Playgroud)

然后我必须否定的大小AB在之前and就可以执行操作.由于结果也应该是否定的,我必须否定结果,以便再次获得正数.对于较大的BigIntegers,否定最多三个值可能是相当大的性能成本.

请注意,我知道如何做到这一点并且结果是正确的,但我想避免由大数组的必要否定引起的缓慢.

例如,我知道一些快捷方式

C := not A;
Run Code Online (Sandbox Code Playgroud)

可以通过计算来实现

C := -1 - A;
Run Code Online (Sandbox Code Playgroud)

这就是我做的,结果很好.这使得not性能与加法或减法相同,因为它避免了操作之前(和之后)的否定.

我的问题是:是否有类似的法律我可以用来避免否定"负面" BigInteger的大小?我的意思是not通过使用减法来计算?

我的意思是简单或不那么简单的法律

not A and not B = not (A or B) // = is Pascal for ==
not A or not B = not (A and B)
Run Code Online (Sandbox Code Playgroud)

但后来为-A和/或-B等我知道

(-A and …
Run Code Online (Sandbox Code Playgroud)

delphi bit-manipulation

8
推荐指数
1
解决办法
443
查看次数