- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在X64
中的DelphiXE7中使用Graphics32
中的StackAlloc
,但是它因错误而崩溃。我尝试将 NOFRAME
添加到代码中,但这也没有帮助。
第一次机会异常(exception),$000000000013FF10。异常类 $C0000005,消息为“c0000005 ACCESS_VIOLATION”。进程Stack.exe (4536)
program Stack;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Classes;
function StackAlloc(Size: Integer): Pointer; register;
asm
{$IFDEF CPUX86}
POP ECX // return address
MOV EDX, ESP
ADD EAX, 3
AND EAX, not 3 // round up to keep ESP dword aligned
CMP EAX, 4092
JLE @@2
@@1:
SUB ESP, 4092
PUSH EAX // make sure we touch guard page, to grow stack
SUB EAX, 4096
JNS @@1
ADD EAX, 4096
@@2:
SUB ESP, EAX
MOV EAX, ESP // function result = low memory address of block
PUSH EDX // save original SP, for cleanup
MOV EDX, ESP
SUB EDX, 4
PUSH EDX // save current SP, for sanity check (sp = [sp])
PUSH ECX // return to caller
{$ELSE}
.NOFRAME
MOV RAX, RCX
POP R8 // return address
MOV RDX, RSP // original SP
ADD ECX, 15
AND ECX, NOT 15 // round up to keep SP dqword aligned
CMP ECX, 4092
JLE @@2
@@1:
SUB RSP, 4092
PUSH RCX // make sure we touch guard page, to grow stack
SUB ECX, 4096
JNS @@1
ADD ECX, 4096
@@2:
SUB RSP, RCX
MOV RAX, RSP // function result = low memory address of block
PUSH RDX // save original SP, for cleanup
MOV RDX, RSP
SUB RDX, 8
PUSH RDX // save current SP, for sanity check (sp = [sp])
{$ENDIF}
end;
{ StackFree pops the memory allocated by StackAlloc off the stack.
- Calling StackFree is optional - SP will be restored when the calling routine
exits, but it's a good idea to free the stack allocated memory ASAP anyway.
- StackFree must be called in the same stack context as StackAlloc - not in
a subroutine or finally block.
- Multiple StackFree calls must occur in reverse order of their corresponding
StackAlloc calls.
- Built-in sanity checks guarantee that an improper call to StackFree will not
corrupt the stack. Worst case is that the stack block is not released until
the calling routine exits. }
procedure StackFree(P: Pointer); register;
asm
{$IFDEF CPUX86}
POP ECX { return address }
MOV EDX, DWORD PTR [ESP]
SUB EAX, 8
CMP EDX, ESP { sanity check #1 (SP = [SP]) }
JNE @Exit
CMP EDX, EAX { sanity check #2 (P = this stack block) }
JNE @Exit
MOV ESP, DWORD PTR [ESP+4] { restore previous SP }
@Exit:
PUSH ECX { return to caller }
{$ELSE}
POP R8 { return address }
MOV RDX, QWORD PTR [RSP]
SUB RCX, 16
CMP RDX, RSP { sanity check #1 (SP = [SP]) }
JNE @Exit
CMP RDX, RCX { sanity check #2 (P = this stack block) }
JNE @Exit
MOV RSP, QWORD PTR [RSP + 8] { restore previous SP }
@Exit:
PUSH R8 { return to caller }
{$ENDIF}
end;
var
SL: ^TStringList;
begin
SL := StackAlloc(SizeOf(TStringList)); // Crashes here.
SL^ := TStringList.Create;
SL^.Add('sda');
FreeAndNil(SL^);
StackFree(sl);
Readln;
end.
最佳答案
您的StackAlloc
版本在x64版本末尾缺少PUSH R8
。因此,返回地址不会放回堆栈中。
关于delphi - 如何在 x64 中使用 StackAlloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27809091/
下面的“修复”让我很困惑;这里的场景是根据大小有条件地决定是使用堆栈还是租用缓冲区 - 这是一个非常利基但有时必要的优化,但是:使用“明显”的实现(数字 3,推迟明确的分配,直到我们真正想要分配它),
继续我的 F# 性能测试。有关更多背景信息,请参见此处: f# NativePtr.stackalloc in Struct Constructor F# NativePtr.stackalloc U
我正在玩 stackalloc并在它的返回类型中发现了很多奇怪之处。以下是使用 stackalloc 的一些示例: 1. 隐式输入返回 float* : var a = stackalloc floa
我从一篇较早的 StackOverflow 帖子中读到了一个关于何时使用 stackalloc 的示例。现在这个例子让我有点困惑: public unsafe void DoSomeStuff() {
在下面的代码中: unsafe { int m = 10; int n = 10; double*[] a = new double*[m]; for (int i =
有没有人在用 C# 编程时实际使用过 stackalloc?我知道它的作用,但它唯一一次出现在我的代码中是偶然的,因为 Intellisense 在我开始输入 static 时提示它,例如。 虽然它与
我正在用 C# 编写一些不安全的代码(跟进 this question )并且我想知道,为什么 stackalloc 确实如此关键字必须用作变量初始值设定项?例如这将产生语法错误: public un
我最近在用 C# 编写一些不安全的代码并注意到这会产生语法错误: public unsafe class UnsafeByteStream { public UnsafeByteStream(
以下代码用非零值初始化两个 stackalloc 数组。虽然数组 A 已正确初始化,但数组 B 仍填充零,这与预期相反。 通过反汇编编译后的可执行文件,可以看到没有为数组B生成初始化代码,这是为什么?
我发现了一个博客条目,它暗示有时 c# 编译器可能会决定将数组放在堆栈而不是堆上: Improving Performance Through Stack Allocation (.NET Memor
知道为什么“stackalloc”关键字接受可变长度吗? 如果这条指令返回一个指向分配在堆栈帧中的缓冲区的指针,编译器如何管理它?每次调用它来组织堆栈框架时,它都会在运行时重新编译该函数? 谢谢。 最
如果 stackalloc 与引用类型一起使用,如下所示 var arr = stackalloc string[100]; 有错误 Cannot take the address of, get t
如果我在 C# 中使用 stackalloc 分配内存,内存是否已初始化(使用 0)? 文档没有提到这一点,只说明保留了正确的金额。 在我的测试中,此类内存默认为 0,但这并不意味着它是有保证的。 最
我对 stackalloc 运算符的功能有一些疑问。 它实际上是如何分配的?我认为它会做类似的事情: void* stackalloc(int sizeInBytes) { void* p =
我试图在X64中的DelphiXE7中使用Graphics32中的StackAlloc,但是它因错误而崩溃。我尝试将 NOFRAME 添加到代码中,但这也没有帮助。 第一次机会异常(exception
我正在进行一些 F# 性能测试,并尝试在堆栈而不是堆上创建数组(值与引用类型)。我正在使用 NativePtr.stackalloc 在堆栈上分配内存。在下面的第一个构造函数中出现错误。 type S
是否有一个用 C 实现的 stackalloc 函数,允许您在堆栈上分配一个可变长度的数组,如 stackalloc in C# ? 最佳答案 有 alloca 但它不是标准的。此外,自 C99 以来
就我而言,以下代码将在堆栈上创建一个数组: unsafe struct Foo { public fixed int bar[10]; } var foo = new Foo(); stacka
我刚刚发现 C# 的 stackalloc 符号有一个令人难以置信的怪癖,请看下面的代码: // int *p; // p = stackalloc int[42]
stackalloc 关键字提供什么功能?我何时以及为什么要使用它? 最佳答案 来自 MSDN : Used in an unsafe code context to allocate a block
我是一名优秀的程序员,十分优秀!