小编Sur*_*ain的帖子

为什么GCC不优化a*a*a*a*a*a到(a*a*a)*(a*a*a)?

我正在对科学应用进行一些数值优化.我注意到的一件事是GCC会pow(a,2)通过编译来优化调用a*a,但调用pow(a,6)没有优化,实际上会调用库函数pow,这会大大降低性能.(相比之下,英特尔C++编译器,可执行文件icc,将消除库调用pow(a,6).)

我很好奇的是,当我更换pow(a,6)a*a*a*a*a*a使用GCC 4.5.1和选项" -O3 -lm -funroll-loops -msse4",它采用5分mulsd的说明:

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
Run Code Online (Sandbox Code Playgroud)

如果我写(a*a*a)*(a*a*a),它会产生

movapd  %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm14, %xmm13
mulsd   %xmm13, %xmm13
Run Code Online (Sandbox Code Playgroud)

这将乘法指令的数量减少到3. icc具有类似的行为.

为什么编译器不能识别这种优化技巧?

floating-point assembly gcc compiler-optimization fast-math

2083
推荐指数
12
解决办法
20万
查看次数

jQuery keypress,keydown,keyup black magic(Macs)背后的理论是什么?

我对keypress,keydownkeyup的各种行为感到困惑.似乎我错过了一个重要的文档,一个解释了这个三重奏的细微之处和细微差别.有人可以帮我弄清楚我需要阅读哪个文件才能更有效地使用这些事件吗?如果您需要详细信息,请参阅下文.

@ov:你让我展示一些代码,但这并不是我试图解决的代码中的特定问题.我正在尝试处理这些事件处理程序的行为,并要求了解它们的人指出一个好的文档.

我使用jQuery构建输入表单并将其插入到我的文档中.它工作得很好,大多数情况下.我希望表单像我在其中看到的大多数其他输入表单一样响应键盘:esc键应该忽略表单与单击取消按钮相同,并且因为表单上有一个<textarea>,cmd+ enter应该与单击时相同确定按钮.使用按键事件似乎很简单.问题是Chrome不会为密钥或+ 调用我的按键处理程序.它会激发+ 和+ 以及字母数字,但不是+ .esccmdenterctrlenteroptionentercmdenter

所以我会改用密钥.我得到KEYUPesc,和KEYUPcmd,和KEYUPenter,伟大的.但我没有得到KEYUPenter,而我按住键cmd.

第三次是魅力,你可能会认为keydown似乎工作,但有了keydown,你会得到重复键.我知道,你所要做的就是在第一次调用时解除处理程序的绑定,但三种不同的事件类型表现得如此不同似乎很奇怪.为什么是这样?那里有一个明显的文件,我显然还没读过吗?

macos jquery keypress keydown keyup

49
推荐指数
2
解决办法
3万
查看次数

为什么动态打字经常与口译语言相关联?

简单的问题:我在编译语言(如C++/Java)和Python/Javascript等解释语言中进行了大量编程(专业和个人).我个人发现,当我使用静态类型语言编程时,我的代码几乎总是更强大.但是,我遇到的几乎所有解释语言都使用动态类型(PHP,Perl,Python等).我知道为什么编译语言使用静态类型(大多数时候),但我无法弄清楚解释语言设计中对静态类型的厌恶.

为什么陡峭断开?它是解释语言性质的一部分吗?OOP?

type-systems language-design static-typing typing dynamic-typing

40
推荐指数
2
解决办法
5445
查看次数

总线错误与分段故障

总线错误和分段错误之间的区别?是否会发生程序发出seg故障并第一次停止并且第二次发生总线错误并退出?

c segmentation-fault bus-error sigbus

37
推荐指数
4
解决办法
3万
查看次数

哪些语言是动态类型和编译的(哪些是静态类型和解释的)?

在我对动态和静态类型的阅读中,我不断反对编译静态类型语言的假设,同时解释动态类型语言.我知道一般来说这是真的,但我对异常感兴趣.

我真的希望有人不仅可以提供这些例外的一些例子,而是试图解释为什么决定这些语言应该以这种方式工作.

type-systems programming-languages static-typing dynamic-typing

37
推荐指数
1
解决办法
5721
查看次数

按值将数组传递给函数

以下是C Programming Just the FAQs一书的摘录.这不是错误的,因为Arrays永远不能通过引用传递吗?

VIII.6:如何通过值将数组传递给函数?

答案:通过在被调用函数中声明带有方括号([])的数组名称,数组可以按值传递给函数.调用函数时,只需将数组的地址(即数组的名称)传递给被调用的函数即可.例如,以下程序将数组传递 x[]byval_func()value 命名 的函数:

int[]参数告诉编译器该byval_func() 函数将采用一个参数 - 一个整数数组.byval_func()调用该 函数时,将数组的地址传递给 byval_func():

byval_func(x);
Run Code Online (Sandbox Code Playgroud)

由于数组是按值传递的,因此会生成数组的精确副本并将其放在堆栈中.然后被调用的函数接收该数组的副本并可以打印它.因为传递给的数组 byval_func()是原始数组的副本,所以修改byval_func()函数中的数组对原始数组没有影响.

c arrays pass-by-reference pass-by-value

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

......的操作可能未定义?

我有以下代码

FRAME frameArray[5][10]; // Create the array of frames
int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for each node is
int trackFront[5] = {0, 0, 0, 0, 0}; // Array to keep track of which is the front of the array
int trackTail[5] = {0, 0, 0, 0, 0};


// Function to add to the array (CHANGE int frame)
void addFrame (int nodeNumber, FRAME frame)
{
    //Calc tail
    int tail = trackTail[nodeNumber-1]; …
Run Code Online (Sandbox Code Playgroud)

c undefined-behavior

35
推荐指数
3
解决办法
3万
查看次数

使用C++代码清除Linux中的终端

好吧,我一直在研究如何做到这一点,但说我运行具有终端输出的全位的程序,我将如何清除屏幕从我的计划之内,这样我可以保持我的程序运行?

我知道我可以只输入clear端子,它会清除它很好,但就像我说的,这个程序将是对我来说更有益.

我发现了一些有效的东西,但是,我不确定它是什么或者它在做什么.

cout << "\033[2J\033[1;1H";
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我不知道它是什么,如果你能解释它,我会非常感激.

c++ linux terminal

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

使用querySelectorAll().订购的方法返回的结果是?

我正在尝试制作一个适用于多个页面的js代码.我正在尝试使用querySelectorAll()从DOM中获取元素.

我需要订购的元素.为了做到这一点,我可以使用xPath或选择器(我更喜欢使用选择器,但xPath也可以).问题是:
querySelectorAll()返回的NodeList中的元素是否按照标记在HTML中出现的顺序排序?

注意:我想添加标签:querySelectorAll

javascript css css-selectors selectors-api

32
推荐指数
1
解决办法
6886
查看次数

为什么这个C或C++宏没有被预处理器扩展?

当用gcc 4.1.0编译时,有人能指出代码中的问题.

#define X 10
int main()
{
  double a = 1e-X;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:指数没有数字.

当我用10替换X时,它工作正常.我还用g ++ -E命令检查了应用了预处理器的文件,它没有用10替换X.我的印象是预处理器用替换文本替换文件中定义的每个宏并应用任何智能.我错了吗?

我知道这是一个非常愚蠢的问题,但我很困惑,我宁愿愚蠢而不是困惑:).

有什么意见/建议吗?

c c++ macros c-preprocessor

31
推荐指数
4
解决办法
7761
查看次数