小编The*_*Man的帖子

抽象类中的公共构造函数是一个代码吗?

抽象类中的公共构造函数是一个代码吗?使构造函数受到保护可提供您可以使用的所有访问权限.使其公开的唯一附加访问权限是允许将类的实例声明为无法访问其受保护成员的范围中的变量,但是根本不能声明抽象类的实例.

c++

12
推荐指数
2
解决办法
2734
查看次数

在Screeps中,是否以允许CPU限制强健代码的方式强制执行CPU限制?

在Screeps中,每个玩家对CPU的使用都是有限的,但是此功能文档并没有使得强制执行的方式足以清楚地编写CPU限制强健代码.我考虑过以下四种可能性:


1.玩家的周期永远不会中断.

在一个极端,玩家的内存反序列化,主脚本执行和内存重新序列化永远不会中断,超过CPU限制只是意味着玩家的循环将在后续的滴答中被跳过,直到CPU债务被偿还为止.在这种情况下,CPU限制强健代码并不是绝对必要的,但是检测播放器的循环何时被跳过并且可能更有效地开始执行操作仍然是有用的.这可以使用以下代码轻松实现:

module.exports.loop = function()
{
  var skippedTicks = 0;

  if ( 'time' in Memory )
  {
    skippedTicks = Game.time - Memory.time - 1;
  }

  // Main body of loop goes here, and possibly uses skippedTicks to try to do
  // things more efficiently.

  Memory.time = Game.time;
};
Run Code Online (Sandbox Code Playgroud)

这种管理玩家CPU使用率的方式容易受到无限循环的滥用,我几乎可以肯定这不是Screeps的行为.

2.玩家的周期是原子的.

下一个可能性是玩家的周期是原子的.如果超出CPU限制,则播放器的周期中断,但预定的游戏状态不会更改,也不会提交对内存的更改.在检测到中断循环时提高效率变得更加重要,因为忽略它意味着玩家的脚本将无法改变游戏状态或记忆.但是,检测中断的周期仍然很简单:

module.exports.loop = function()
{
  var failedTicks = 0;

  if ( 'time' in Memory )
  {
    failedTicks = Game.time - Memory.time - 1;

    // N …
Run Code Online (Sandbox Code Playgroud)

javascript screeps

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

C#是否与C++中的#pragma pack等效?

C#提供了StructLayoutAttribute.Pack,但它的行为是"每个成员至少获得指定的对齐,无论它是否需要",而C++中#pragma pack的行为是"每个成员都得到它想要的对齐,除非它想要更多比指定的对齐,在这种情况下,它不能保证得到更多".

有没有办法使C#中的结构布局与C++中具有特定#pragma包的类似结构的布局相同,除了在每个成员上使用StructLayout(LayoutKind.Explicit)和FieldOffset,或者插入未使用的填充成员?

c# c++ marshalling

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

Windows可以处理跨越32位/ 64位边界的继承吗?

如果一个进程是32位而另一个进程是64位,子进程是否可以从其父进程继承句柄?

HANDLE是Win64上的64位类型和Win32上的32位类型,这表明即使它在所有情况下都应该是可能的,但在某些情况下它会失败:64位父进程,32-位子进程,以及无法用32位表示的句柄.

或者是将对象命名为32位进程和64位进程以获取同一对象句柄的唯一方法?

windows 64-bit 32-bit handle 32bit-64bit

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

为什么ia32/x64操作码将文档0x66和0xF2映射为操作码0x0F38F1(CRC32)的双重必需前缀?

在英特尔64和IA-32架构软件开发人员手册中,行F表A-4附录A.3卷2C(订单号326018-045US 2013年1月)的独特之处在于它具有前缀子行,用于两个组合前缀:0x66和0xF2.

与此相关的唯一操作码是0x0F38F1(CRC32).对于前缀0xF2,源操作数是Ey(存储器或通用寄存器; 32位或64位),对于前缀0x66和0xF2,源操作数是Ew(存储器或通用寄存器;总是16位)

但是,如果0x66只是可选的操作数大小覆盖前缀而不是两个强制前缀的组合中的第一个,那么这些源操作数与它们将是相同的.实际上,作为可选前缀的0x66是第3.2章第2A卷中CRC32指令的记录(隐式地:16位和32位源操作数的相同字节序列).看起来该表可能省略了0x66和0xF2行,并将源操作数记录为0xF2行中的Ev(存储器或通用寄存器; 16位或32位或64位).

操作码映射是否有理由以这种独特的方式记录操作码0x0F38F1的源操作数?

编辑:增加了手册版本

x86 assembly x86-64 machine-code opcode

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