小编Gra*_*ity的帖子

Java的System.arraycopy()对小型数组有效吗?

Java System.arraycopy()对于小型数组是否有效,或者它是一种本机方法使得它可能比简单的循环和函数调用效率低得多?

本机方法是否会因跨越某种Java系统桥而产生额外的性能开销?

java performance

52
推荐指数
6
解决办法
2万
查看次数

究竟什么数据结构是C++中的deques?

是否有一个特定的数据结构,C++ STL中的deque应该实现,或者是一个deque只是这个模糊的概念,一个数组可以从前面和后面增长,然而实现选择实现?

我以前总是假设deque是一个循环缓冲区,但我最近在这里读了一个C++引用,听起来像deque是某种数组的数组.它似乎不是一个普通的旧循环缓冲区.那么它是一个间隙缓冲区,还是可扩展数组的其他变体,还是仅仅依赖于实现?

答案的更新和摘要:

似乎普遍的共识是,双端队列是一种数据结构,这样:

  • 插入或删除元素的时间应该在列表的开头或结尾处是恒定的,并且在其他地方最多是线性的.如果我们将此解释为真正的恒定时间而非摊销的恒定时间,正如有人评论,这似乎具有挑战性.有些人认为我们不应将此解释为非摊销的常数时间.
  • "deque要求任何插入都应保持对成员元素的任何引用有效.迭代器可以无效,但成员本身必须保留在内存中的相同位置." 正如有人评论的那样:只需将成员复制到堆上的某个位置并将T*存储在引擎盖下的数据结构中即可.
  • "在双端队列的开头或末尾插入单个元素总是需要一个恒定的时间,并导致对T的构造函数的单个调用." 如果数据结构在引擎盖下存储T*,也将实现T的单个构造函数.
  • 数据结构必须具有随机访问权限.

如果我们将第一个条件设为"非摊销的恒定时间",似乎没有人知道如何得到第一和第四条件的组合.链表实现1)但不是4),而典型的循环缓冲实现4)但不实现1).我想我的实现可以满足以下两个要求.评论?

我们从其他人建议的实现开始:我们分配一个数组并从中间开始放置元素,在前面和后面留下空间.在这个实现中,我们跟踪中心在前后方向上有多少元素,调用那些值F和B.然后,让我们用一个两倍于原始大小的辅助数组来扩充这个数据结构.数组(所以现在我们浪费了大量的空间,但渐近的复杂性没有变化).我们还将从中间填充这个辅助数组,并给它类似的值F'和B'.策略是这样的:每次我们在给定方向上向主数组添加一个元素时,如果F> F'或B> B'(取决于方向),最多两个值从主数组复制到辅助数据数组直到F'赶上F(或B'跟B).因此,插入操作涉及将1个元素放入主数组并从主数据库复制到辅助数据2,但它仍然是O(1).当主阵列变满时,我们释放主阵列,使辅助阵列成为主阵列,并制作另一个大2倍的辅助阵列.这个新的辅助数组以F'= B'= 0开始,并且没有复制到它(因此如果堆分配是O(1)复杂度,则调整大小op为O(1)).由于添加到主要和主要的每个元素的辅助副本2个元素最多开始半满,因此当主要用完空间时,辅助节点不可能赶上主要元素.删除同样只需要从主要删除1个元素,从辅助删除0或1.因此,假设堆分配为O(1),则此实现满足条件1).我们使数组为T*,并new在插入时使用以满足条件2)和3).最后,4)被实现,因为我们使用数组结构并且可以轻松实现O(1)访问.

c++ data-structures

36
推荐指数
4
解决办法
6313
查看次数

关于返回值优化的C++问题

在这个网站上有很多关于返回值优化的问题(我认为这是一个相当令人困惑的话题),但我似乎无法找到一个回答我特定问题的问题.如果我有这样的代码:

returnType function() { stuff....}

void someOtherFunction()
{
    returnType var = function();
    more stuff...
}
Run Code Online (Sandbox Code Playgroud)

我被告知编译器可能决定不使用returnTypein的两个实例someOtherFunction().从逻辑上讲,我希望function()生成一个类型的对象returnType,并someOtherFunction()通过复制构造函数(重载或不重载)将该值接收到临时值.然后我希望通过赋值(可以重载并且理论上可以具有任何类型的功能!)来复制临时值,这可以var通过默认构造函数进行初始化.

我在这看到一个潜在的问题.如果没有这个临时副本会发生什么returnTypesomeOtherFunction()?是不是var必须通过复制构造函数function()直接用返回的值填充?如果是这样,不会调用赋值运算符吗?如果是这样,并且如果赋值运算符过载,那么这不能改变程序的功能吗?如果是这样,这是否意味着程序员有责任确保=始终与复制构造函数做同样的事情?我讨厌运行这一长串问题,但如果是这样,为什么C++允许您定义复制构造函数来执行除赋值之外的其他操作?

c++

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

抛出异常的方法如何内联?

我只是好奇Java JVM有时如何内联可能抛出异常的方法.我假设至少可以内联一些这样的方法(例如那些具有数组访问并因此有可能抛出ArrayIndexOutOfBoundsExceptions的方法).我看到的问题是,如果实际发生异常,如果你已经内联了方法,你如何显示正确的堆栈跟踪?由于可以在不同的机器上内联不同的方法,内联如何不破坏堆栈跟踪机制?

java performance exception-handling exception

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

创建新线程是否会产生刷新缓存的副作用?

我想知道在Java中创建新线程是否会触发缓存刷新.假设我按照以下顺序执行此类操作:

  1. 线程运行并设置变量X.
  2. 该线程创建一个新线程.
  3. 新线程访问X.

我的问题是:是新的线程,无论是在当时这是创建或在当时开始执行,保证看到由旧线在步骤1到X所做的更新?我知道如果旧线程将来更改X的值,则无法保证新线程将看到这些更改.没关系.我只是想知道新线程在启动时是否会看到正确的值,而不需要显式同步.

当我第一次决定调查这个主题时,我认为一个简单的谷歌搜索会立即显示答案,但由于某种原因,我找不到任何解决这个问题的结果.

java concurrency multithreading thread-safety

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

Java以外的哪些语言具有非特权代码与特权代码的安全模型?

我最近了解了Java的安全模型.大多数人认为Java是安全的,因为它不受缓冲区溢出等的影响,但是整个Java安全模型都集中在检查代码是否有权采取某些操作.他们真正解决了一个具有挑战性的问题:如何让任意不受信任的代码(例如在网络浏览器中)运行但是无法以恶意方式访问底层系统,同时保留以某种方式与系统交互的能力.

Sandboxed C++或类似的东西甚至很难尝试,因为语言要求你能够做指针算术等,允许恶意代码破坏过程的其他部分.但是,由于有许多内存安全的语言,我想知道其他语言有哪些复杂的安全模型以及它们与Java的比较.

我不知道有多少语言努力拥有像"沙盒"等概念.我正在寻找一些指导来了解这个有趣的计算机安全方向.

java security

5
推荐指数
1
解决办法
154
查看次数

Java 中内存分配的典型速度是多少?

我在分析 Java 应用程序时发现对象分配的速度比我预期的要慢得多。我运行了一个简单的基准测试来尝试建立小对象分配的整体速度,我发现在我的机器上分配一个小对象(3 个浮点数的向量)似乎需要大约 200 纳秒。我在(双核)2.0 GHz 处理器上运行,所以这大约是 400 个 CPU 周期。我想问一下之前对 Java 应用程序进行过概要分析的人,这种速度是否可以预期。这对我来说似乎有点残忍和不寻常。毕竟,我认为像 Java 这样可以压缩堆并重定位对象的语言将具有如下所示的对象分配:

int obj_addr = heap_ptr;
heap_ptr += some_constant_size_of_object
return obj_addr;
Run Code Online (Sandbox Code Playgroud)

....这是几行组装。至于垃圾收集,我不会分配或丢弃足够的对象来发挥作用。当我通过重用对象来优化我的代码时,我获得了大约 15 纳秒/我需要处理的对象的性能,而不是我需要处理的每个对象 200 ns,因此重用对象极大地提高了性能。我真的不想重用对象,因为这使得符号有点麻烦(许多方法需要接受一个receptacle参数而不是返回一个值)。

所以问题是:对象分配花费这么长时间是否正常?或者我的机器上可能有什么问题,一旦修复,可能会让我在这方面有更好的表现?其他人的小对象分配通常需要多长时间,是否有典型值?我正在使用客户端机器,目前没有使用任何编译标志。如果您的机器运行速度更快,那么您机器的 JVM 版本和操作系统是什么?

我意识到就性能而言,个人里程可能会有很大差异,但我只是想问问我上面提到的数字是否正确。

java performance memory-management

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

C++:函数返回指针不应该是const的任何原因?

我想知道返回指针的函数是否应该是const是否有任何原因.我正在研究一些在大多数地方似乎是const-correct的代码,但由于某种原因,并没有声明函数将指针返回为const.例如,它写道

virtual Joint* getJointByID(unsigned int id);
Run Code Online (Sandbox Code Playgroud)

代替

virtual Joint* getJointByID(unsigned int id) const;
Run Code Online (Sandbox Code Playgroud)

如果getJointByID函数本身实际上并没有改变该类的任何成员,那么const是否应该存在?

c++

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

Qt - moc导致C2504:基类未定义

我有一个问题,我一直试图解决一段时间,但我完全被难倒了.所以我有两个类,X和Y,它们每个都有自己的头文件,Xh和Yh每个都是Q_OBJECT,并且在头文件中有这个宏定义.

class Y: public X { Q_OBJECT ...}
Run Code Online (Sandbox Code Playgroud)

Y读物的定义.X的定义如下:

class X: public QGLWidget {Q_OBJECT ...}
Run Code Online (Sandbox Code Playgroud)

当我编译时,X.cpp和Y.cpp正确编译,在那个阶段没有问题.moc文件也生成没有问题.

但是,当标准QT构建过程进行编译moc_X.cpp时,它会给我"C:\ path\Yh(34):错误C2504:'X':基类未定义".但是当它编译Y.cpp或X.cpp时不会发生这种情况,它只会在编译moc文件时发生!有任何想法吗?构建将在moc阶段失败,只有moc阶段似乎非常特殊.非常感谢帮助!

qt

3
推荐指数
1
解决办法
2711
查看次数

在Qt中按下按钮时显示

我正在使用Qt和C++,我想制作一个按钮,在推送和释放之后继续向下推.我正在制作按钮QToolBar并做类似的事情toolBar->addAction (icon, tr("Text"));.这使得工具栏上的按钮显示QIcon命名icon并在悬停时显示"文本".当用户按下它们时,它们也看起来被推下来,但是当它们被释放时停止向下看(对于大多数按钮使用来说是合理的).然而,我需要一些与众不同的东西:我只是希望这些按钮在被释放之后仍然被推倒,可能直到它们被再次点击.最好是我可以在按钮或工具栏上调用某些功能,这可以让我有能力控制按钮在显示时是按下还是不按下按钮.这样我就能以编程方式控制按钮外观的这个方面.

在Qt中最简单的方法是什么?我已经看到了涉及边界和非常复杂的设置的奇特方法,但我想知道是否有一种简单的方法可以做到这一点.

qt qtoolbar

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