最近我注意到声明一个包含64个元素的数组比用65个元素声明相同类型的数组快得多(> 1000倍).
这是我用来测试这个的代码:
public class Tests{
public static void main(String args[]){
double start = System.nanoTime();
int job = 100000000;//100 million
for(int i = 0; i < job; i++){
double[] test = new double[64];
}
double end = System.nanoTime();
System.out.println("Total runtime = " + (end-start)/1000000 + " ms");
}
}
Run Code Online (Sandbox Code Playgroud)
这将运行在大约6毫秒,如果我更换new double[64]
用new double[65]
它需要大约7秒.如果作业分布在越来越多的线程中,这个问题会变得更加严重,这是我的问题所在.
不同类型的数组(例如int[65]
或)也会出现此问题String[65]
.大字符串不会发生此问题:String test = "many characters";
但是在更改为此字符串时会发生此问题String test = i + "";
我想知道为什么会这样,如果有可能绕过这个问题.
是否有任何简单/快捷的方式"猛烈"进入vim的"最后搜索"注册表("/)?
从vim文档中可以看出答案是否定的,但可以通过"let"命令进行分配:
It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching. You can't yank or delete into this
register.
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想做的是:
"/5yw
Run Code Online (Sandbox Code Playgroud)
这会将光标下的下5个单词拉出来并将它们放在最后一个搜索缓冲区中
或者,如果有办法搜索命名寄存器的内容,那也可以.换句话说,如果我能做到:
"A5yw
Run Code Online (Sandbox Code Playgroud)
然后搜索寄存器A中的内容,这也可以.
我最接近的是抓到一个命名的寄存器然后将该寄存器复制到最后一个搜索寄存器,例如
"A5yw
:let @/=@A
Run Code Online (Sandbox Code Playgroud)
冒更长时间问题的风险,我想说的是,我并不总是5个单词,我想"猛拉和搜索" - 有时它是17个字符,有时它是在行尾,等等......所以一个硬编码的宏并没有给我我想要的灵活性.
我和一些人说过这个论点,即C出界指针会导致未定义的行为,即使它们没有被解除引用.例:
int a;
int *p = &a;
p = p - 1;
Run Code Online (Sandbox Code Playgroud)
这里的第三行将导致未定义的行为,即使p
永远不会被解除引用(*p
从未使用过).
在我看来,如果没有指针被使用,C会检查指针是否超出界限听起来有点不合逻辑(就像有人会检查街上的人,看看他们是否携带枪支以防他们进入他的房子.理想的做法是在人们即将进入房屋时对他们进行检查.我认为如果C检查,那么会发生很多运行时开销.
另外,如果C真的检查OOB指针那么为什么这不会导致UB:
int *p; // uninitialized thus pointing to a random adress
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使p
指向OOB地址的机会很高,为什么也不会发生任何事情.
加:
int a;
int *p = &a;
p = p - 1;
Run Code Online (Sandbox Code Playgroud)
说&a
是1000. p
评估第三行后的价值是:
p
可能在其他地方取消引用并导致真正的问题.因为我认为"第三行被称为未定义的行为"首先是因为未来可能会使用该OOB指针(解除引用),随着时间的推移,人们将其视为一种未定义的行为.现在,值p
是100%996还是未定义的行为或其值将是未定义的?
有没有人对以下任何嵌入式TCP/IP堆栈有特别好(或坏)的经验?
我的需求是一个坚固,易于端口的堆栈.代码大小并不十分重要,性能相对重要,但易用性和移植非常重要.
系统可能会使用尚未确定的RTOS,但根据我的经验,大多数堆栈可以在有或没有RTOS的情况下使用.该平台很可能是ARM变体(很可能是ARM7或CM3).
不太关心将堆栈连接到以太网驱动程序,因此这不是选择中的重中之重.
我对从Linux,RTEMS等操作系统中提取堆栈并不十分感兴趣.
我也对Interniche,Micrium等商业产品不感兴趣......
堆栈不需要各种各样的铃声和口哨,不需要IPv6,我不需要任何东西(Web服务器,FTP服务器等).事实上,我可能会只使用UDP,虽然我可以设想一些优先使用TCP的方案.
我错过的其他筹码经验当然也非常有趣.
感谢您的时间和意见.
我使用此代码让用户在我正在构建的网站上嵌入YouTube视频:
function BuildYoutubePlayer(youtubeVideoId, width, height) {
youtubePlayer = "<iframe ";
youtubePlayer += "width=\"" + width + "\" ";
youtubePlayer += "height=\"" + height + "\" ";
youtubePlayer += "src=\"http://www.youtube.com/embed/" + youtubeVideoId + "\"&wmode=transparent ";
youtubePlayer += "frameborder=\"0\" allowfullscreen>";
youtubePlayer += "</iframe>";
return youtubePlayer;
}
Run Code Online (Sandbox Code Playgroud)
这个嵌入将在一个图层作为灯箱弹出,当用户关闭此弹出窗口,视频从html中删除,但我在IE8上得到一个黑色全屏,我找不到任何理由,我尝试嵌入youtube视频和删除它,它工作正常,所以我肯定错过了一些东西.请指教.
是否有编译时方法来检测/防止C/C++枚举中的重复值?
问题在于有多个项目被初始化为显式值.
背景:
我继承了一些C代码,如下所示:
#define BASE1_VAL (5)
#define BASE2_VAL (7)
typedef enum
{
MsgFoo1A = BASE1_VAL, // 5
MsgFoo1B, // 6
MsgFoo1C, // 7
MsgFoo1D, // 8
MsgFoo1E, // 9
MsgFoo2A = BASE2_VAL, // Uh oh! 7 again...
MsgFoo2B // Uh oh! 8 again...
} FOO;
Run Code Online (Sandbox Code Playgroud)
问题是随着代码的增长和开发人员向MsgFoo1x
组中添加更多消息,最终它会超出BASE2_VAL
.
这段代码最终会迁移到C++,所以如果只有一个C++解决方案(模板魔术?),那没关系 - 但是使用C和C++的解决方案更好.
我已经想要在相当一段时间内至少学习一些关于编程硬件的想法,并且我想在这里要求得到一些起点.我是一个有着Delphi和Objective-c经验的合理成熟的程序员,但从来没有听过设备端口/中断(我甚至不知道术语),更不用说编写一个硬件了.
从我希望能够做的开始,
我认为这是一个很好的起点,任何人都有指向硬件的指针或我如何开始这个?
我曾经收到过"C++ Report"杂志(以及"C/C++用户期刊"),现在都已经不存在了.
在最长的时间里,我会讨论这些问题,从移动到移动.遗憾的是,几年前我决定停止将它们运到我身边,然后我回收它们.
这些页面中有很多智慧,现在我发现自己希望能将它们带入工作场所,以便其他人可以仔细阅读.我知道和使用的很多内容来自这些页面.
有没有人知道是否存在后期问题,或者存在"C++报告"的DVD/CD-ROM编译?
我知道Dobbs博士有一张DVD,有14年的"C/C++用户期刊".我喜欢为"C++报告"找到类似的东西(或死树等价物).
(冒着听起来像混蛋的风险,我不是在寻找一些来自谷歌搜索的1或2位作者的文章,我正在寻找"整个shebang").
我在一家使用FreeRTOS为多个设备创建固件的公司工作.最近,我们对新功能的要求超过了我们的固件工程师能够完成的工作量,但我们现在也无法雇用任何新功能.即使是微小的变化也需要固件人员进入并修改非常低的水平.
我一直在为FreeRTOS寻找某种解释性语言项目,让我们在更高层次上实现新功能.理想情况下,我想最终得到的东西让设备变得更接近通用计算机,我们编写驱动程序,而不是我们自己必须实现每个功能.
有没有解释java,python或类似字节码的FreeRTOS项目?
我看过google,但由于我自己不是固件工程师,所以我不确定我是否在寻找合适的关键字.
感谢大家
一般来说,UB被认为是必须避免的东西,目前的C标准本身列出了附录J中的不少例子.
但是,在某些情况下,除了牺牲可移植性之外,我认为开发UB没有任何害处.
考虑以下定义:
int a = INT_MAX + 1;
Run Code Online (Sandbox Code Playgroud)
评估此表达式会导致UB.但是,如果我的程序打算在32位CPU上运行,模块化算术代表二进制补码中的值,我倾向于相信我可以预测结果.
在我看来,UB有时只是C标准告诉我的方式:"我希望你知道你在做什么,因为我们无法保证会发生什么."
因此我的问题是:即使C标准认为它可以调用UB,或者"UB"真的要避免,无论情况如何,有时依赖依赖于机器的行为是否安全?