小编Dzi*_*gas的帖子

C++ CodeBlocks反汇编; 方式太多代码?

我在CodeBlocks上运行调试器并查看了反汇编窗口.

我调试的程序的完整源代码如下:

int main(){}
Run Code Online (Sandbox Code Playgroud)

我在窗口中看到的汇编代码如下:

00401020    push   %ebp
00401021    mov    %esp,%ebp
00401023    push   %ebx
00401024    sub    $0x34,%esp
00401027    movl   $0x401150,(%esp)
0040102E    call   0x401984 <SetUnhandledExceptionFilter@4>
00401033    sub    $0x4,%esp
00401036    call   0x401330 <__cpu_features_init>
0040103B    call   0x401740 <fpreset>
00401040    lea    -0x10(%ebp),%eax
00401043    movl   $0x0,-0x10(%ebp)
0040104A    mov    %eax,0x10(%esp)
0040104E    mov    0x402000,%eax
00401053    movl   $0x404004,0x4(%esp)
0040105B    movl   $0x404000,(%esp)
00401062    mov    %eax,0xc(%esp)
00401066    lea    -0xc(%ebp),%eax
00401069    mov    %eax,0x8(%esp)
0040106D    call   0x40192c <__getmainargs>
00401072    mov    0x404008,%eax
00401077    test   %eax,%eax
00401079    jne    0x4010c5 <__mingw_CRTStartup+165>
0040107B    call   0x401934 <__p__fmode> …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly

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

如果我评估循环外部数组的大小,运行时效率是否有差异?

迭代(在此示例中为整数)元素数组的传统方法如下:

int[] array = {5, 10, 15};

for(int i = 0; i < array.length; i++) [
    //do something with array[i]
}
Run Code Online (Sandbox Code Playgroud)

但是,这是否意味着在每次迭代后重新评估"array.length"?这样做会不会更有效率?:

int[] array = {5, 10, 15};

int noOfElements = array.length;

for(int i = 0; i < noOfElements; i++) {
    //do something with array[i]
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,(据我所知)程序只需计算一次,然后查找'noOfElements'变量的值.

注意:我知道增强的for循环,但是当你想使用正在递增的变量(在这个例子中为'i')来实现for循环中的其他内容时,它不能被使用.

我怀疑这实际上是一个问题,即Java编译器是否能够意识到'array.length'没有改变,并且在计算一次后实际重用该值.

所以我的问题是:我写的第一个代码块和第二个代码块的运行时效率是否存在差异?

我从下面的回复中收集的是,当一个数组被实例化时(是正确的单词?),创建一个名为length的实例变量,它等于数组中的元素数.

这意味着语句array.length与计算无关; 它只引用实例变量.

感谢输入的人!

java arrays performance javac

6
推荐指数
1
解决办法
102
查看次数

如何在一组2D点周围拟合边界椭圆

给定一组2d点(笛卡尔形式),我需要找到最小面积椭圆,使得集合中的每个点都位于椭圆上或内部.

我在这个网站上找到了伪代码形式的解决方案,但是我在C++中实现解决方案的尝试却没有成功.

下图以图形方式说明了我的问题的解决方案是什么样的:

一组带有边界椭圆的点

在我的尝试中,我使用了特征库来进行矩阵上的各种操作.

//The tolerance for error in fitting the ellipse
double tolerance = 0.2;
int n = 10; // number of points
int d = 2; // dimension
MatrixXd p = MatrixXd::Random(d,n); //Fill matrix with random points

MatrixXd q = p;
q.conservativeResize(p.rows() + 1, p.cols());

for(size_t i = 0; i < q.cols(); i++)
{
    q(q.rows() - 1, i) = 1;
}

int count = 1;
double err = 1;

const double init_u …
Run Code Online (Sandbox Code Playgroud)

c++ pseudocode eigen

6
推荐指数
1
解决办法
1265
查看次数

如何使用重复的字节值填充64位寄存器

我正在使用Visual C++ 2010和masm('快速调用'调用约定)进行一些x64程序集.

所以我想说我在C++中有一个函数:

extern "C" void fillArray(unsigned char* byteArray, unsigned char value);
Run Code Online (Sandbox Code Playgroud)

指向数组的指针将位于RCX中,char值将位于DL中

如何使用DL为RAX填充值,这样如果我要mov qword ptr [RCX], RAX打印byteArray,所有值都将等于'char value'?

请注意,我不是要编写我的编译器代码,我只是在学习.

64-bit x86 assembly masm

5
推荐指数
2
解决办法
1427
查看次数

如何在cmd中使记事本++功能像常规记事本一样?

我喜欢使用命令提示符来编写和编译java.要编写代码,我在cmd中输入:

记事本MyJavaClass.java

这将打开记事本并询问我是否要创建新文件(如果它尚不存在).对我来说问题是我喜欢使用notepad ++作为文本编辑器,因为它具有很好的功能.

所以我的问题是:

如何制作它以便我可以在cmd中键入"notepad ++ MyJavaClass.java"并打开notepad ++,准备编辑而无需键入记事本++的完整路径?

我试图简单地将notepad ++.exe文件放在System32文件夹中,但是cmd无法识别该命令.

对不起高兴:)

java cmd notepad++

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

一切搜索引擎

我不确定我是否正确地问这个问题,如果我不是,请指出我正确的Stack Exchange网站.

名为"Everything"的NTFS文件系统搜索引擎可以从http://www.voidtools.com/下载 ,因为它表现得很好,我很好奇它编写的编程语言.

我搜索了上述网站的论坛和谷歌没有成功..我明白该应用程序是专有免费软件,所以我将无法获得源代码.但是,我从来没有听说过任何应用程序,其中隐藏了有关其所用语言的信息.

所以我的问题是:什么语言是'一切'写的?

programming-languages

4
推荐指数
1
解决办法
753
查看次数

如何让两个线程轮流修改arraylist?

您将在下面看到的代码尝试实现以下功能:

  • 将"第0行"添加到arraylist中
  • 打印arraylist中的最后一项,即"第0行"
  • 从arraylist中删除最后一项

  • 将"第1行"添加到arraylist中

  • 打印arraylist中的最后一项,即"第1行"从arraylist中删除最后一项

......等等没有尽头.

所以,我期望的输出只是:

第0行

第1行

..

..

然而,我得到的是随机数量的"行i",其中我也是随机的.这是一个示例输出:

第0行

38919行

47726行

第54271行

然后程序陷入似乎死锁的状态,即使这没有意义,因为变量'hold'只能是true或false,并且这些情况之一应该允许其中一个线程工作.

import java.util.*;

public class Test {

     static boolean held = true;
     static ArrayList<String> line = new ArrayList<>();


     public static void main(String[] args) {

        new Thread() {
            @Override
            public void run() {
                int i = 0;
                while(true) {
                    if(held) {
                        line.add("Line " + i);
                        i++;
                        held = false;
                    }
                }
            }


        }.start();

        while(true) {
            if(!held) {
                System.out.println( line.get(line.size() - 1) );
                line.remove(line.size() - …
Run Code Online (Sandbox Code Playgroud)

java multithreading arraylist

4
推荐指数
1
解决办法
824
查看次数

如何收集和准备用于语音识别的数据?

据我所知,大多数语音识别实现都依赖于二进制文件,这些文件包含他们试图"识别"的语言的声学模型.

那么人们如何编译这些模型呢?

人们可以手动转录大量的演讲,但这需要花费很多时间.即使这样,当给出包含一些语音的音频文件并在文本文件中完整转录它时,单词发音仍然需要以某种方式分开.为了匹配音频的哪些部分对应于文本,仍然需要语音识别.

这是如何聚集的?如果一个人被移交了数千小时的音频文件和他们的完整转录(无论必须手动转录的问题),音频如何以正确的间隔分开,其中一个单词结束而另一个单词开始?不会产生这些声学模型软件已经必须能够语音识别的?

speech-recognition training-data

2
推荐指数
1
解决办法
1362
查看次数