在C#中有一些已定义的通用容器,它可以同时用作Stack和Queue吗?我只是希望能够将元素追加到末尾或队列的前面
谢谢
我对stackalloc操作员的功能有几个问题.
它是如何实际分配的?我认为它的确如下:
void* stackalloc(int sizeInBytes)
{
void* p = StackPointer (esp);
StackPointer += sizeInBytes;
if(StackPointer exceeds stack size)
throw new StackOverflowException(...);
return p;
}
Run Code Online (Sandbox Code Playgroud)
但我做了一些测试,我不确定它是如何工作的.我们无法确切知道它的作用以及它是如何做到的,但我想知道基础知识.
我认为堆栈分配(好吧,我确实相信它)比堆分配快.那么为什么这个例子:
class Program
{
static void Main(string[] args)
{
Stopwatch sw1 = new Stopwatch();
sw1.Start();
StackAllocation();
Console.WriteLine(sw1.ElapsedTicks);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
HeapAllocation();
Console.WriteLine(sw2.ElapsedTicks);
}
static unsafe void StackAllocation()
{
for (int i = 0; i < 100; i++)
{
int* p = stackalloc int[100];
}
}
static void HeapAllocation() …Run Code Online (Sandbox Code Playgroud)Ruby是否在堆上分配所有内容,或者是否有任何存储在堆栈中的实例?我的印象是所有变量基本上都在堆栈上,并且包含对堆上对象的透明引用.我这个想法是否正确?这个实现是否具体?
另外,如果是在堆栈上分配变量并且仅包含隐藏指针的情况,那么变量本身(忽略它们指向的对象)消耗了多少字节?
编辑:
问这个问题是因为我试图弄清楚光纤的4kB堆栈限制是否会成为这个问题的一个问题.似乎(使用MRI 1.9.3)每个变量本身消耗一个字节,并且与光纤相关的开销很小,这使得可用的堆栈大小减少了几个字节.
此代码将在第4,045次迭代时失败:
count = 0
loop do
count += 1
puts count
varlist = String.new
count.times do |i|
varlist += "a#{i} = 1\n"
end
s = "fiber = Fiber.new do \n #{varlist} \n end \n fiber.resume"
eval(s)
end
Run Code Online (Sandbox Code Playgroud) 是否可以在CPython中以编程方式构造堆栈(一个或多个堆栈帧)并在任意代码点开始执行?想象一下以下场景:
您有一个工作流引擎,其中工作流可以在Python中编写脚本,其中包含一些构造(例如分支,等待/加入),这些构造是对工作流引擎的调用.
阻塞调用(例如等待或连接)在具有某种持久性后备存储的事件调度引擎中设置侦听器条件.
您有一个工作流脚本,它调用引擎中的等待条件,等待稍后将发出信号的某些条件.这将在事件调度引擎中设置侦听器.
工作流脚本的状态,包括程序计数器(或等效状态)的相关堆栈帧是持久的 - 因为等待条件可能在几天或几个月后发生.
在此期间,工作流引擎可能会停止并重新启动,这意味着必须能够以编程方式存储和重新构建工作流脚本的上下文.
事件调度引擎触发等待条件获取的事件.
工作流引擎读取序列化状态并堆栈并使用堆栈重构线程.然后在调用等待服务的点继续执行.
问题
可以使用未修改的Python解释器吗?更好的是,有人能指出一些可能涵盖此类事物的文档,或者以编程方式构造堆栈帧并在代码块中间某处开始执行的代码示例吗?
编辑:为了澄清'未修改的python解释器',我不介意使用C API(在PyThreadState中是否有足够的信息来执行此操作?)但我不想去探讨Python解释器的内部并且有建立一个修改过的.
更新:从一些初步调查,可以获得执行上下文PyThreadState_Get().这将返回PyThreadState(定义在pystate.h)中的线程状态,该状态具有对堆栈帧的引用frame.堆栈帧保存在一个结构类型中PyFrameObject,定义为frameobject.h. PyFrameObject有一个字段f_lasti(bobince的道具),它有一个程序计数器,表示为从代码块开头的偏移量.
这最后是一个好消息,因为它意味着只要您保留实际编译的代码块,您就应该能够根据需要为尽可能多的堆栈帧重建本地,并重新启动代码.我想说这意味着它在理论上是可能的,而不必制作一个修改过的python interpereter,虽然这意味着代码仍然可能会非常繁琐并与特定版本的解释器紧密耦合.
剩下的三个问题是:
事务状态和'saga'回滚,这可能是通过一种用于构建O/R映射器的元类黑客来完成的.我确实曾经构建过一次原型,因此我对如何实现这一目标有了一个很好的了解.
强大地序列化事务状态和任意本地.这可以通过读取__locals__(可从堆栈帧获得)并以编程方式构建对pickle的调用来完成.但是,我不知道在那里可能有什么,如果有的话.
版本控制和升级工作流程.这有点棘手,因为系统没有为工作流节点提供任何符号锚.我们所拥有的只是锚点为了做到这一点,人们必须确定所有入口点的偏移并将它们映射到新版本.可能手动完成,但我怀疑自动化很难.如果您想支持此功能,这可能是最大的障碍.
更新2: ( PyCodeObject)code.h有地址的列表(f_lasti) - >在行号的映射PyCodeObject.co_lnotab(如果错在这里指正).这可以用于促进迁移过程以将工作流更新到新版本,因为冻结的指令指针可以映射到新脚本中的适当位置,根据行号完成.仍然相当混乱,但更有希望.
更新3:我认为答案可能是Stackless Python. 您可以暂停任务并将其序列化.我还没有弄清楚这是否也适用于堆栈.
可能重复:
何时最好使用堆栈而不是堆,反之亦然?
我已经阅读了关于堆与堆栈的其他一些问题,但它们似乎更关注堆/堆栈的作用而不是使用它们的原因.
在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针与在堆中查找可用空间),并且您在使用它时不必手动释放已分配的内存.我可以看到使用堆分配的唯一原因是,如果要在函数中创建对象,然后在函数作用域之外使用它,因为堆栈分配的内存在从函数返回后自动取消分配.
还有其他原因使用堆分配而不是我不知道的堆栈分配吗?
我在网上发现了这个问题.
给定堆栈S,编写C程序以对堆栈进行排序(按升序排列).我们不允许对堆栈的实现方式做任何假设.唯一要使用的功能是:
Push
Pop
Top
IsEmpty
IsFull
Run Code Online (Sandbox Code Playgroud)
我认为我们可以构建堆并对其进行排序.什么是最佳解决方案?
我想用Java创建一个Stack,但是要修改它的大小.例如,创建一个新的Stack,将大小设置为10,然后当我将项目推送到堆栈时它会填满,当它填充到10时,堆栈中的最后一个项目被推下(删除).我想使用Stack,因为它使用LIFO并且非常符合我的需求.
但是Stack从Vector继承的setSize()方法似乎并没有实际限制Stack的大小.我想我错过了一些关于Stacks如何工作的东西,或者Stacks并不意味着受到限制所以这是不可能的.请教育我!
我NSSetUncaughtExceptionHandler用来将堆栈跟踪打印到iPhone中的本地文件,这将在下次启动应用程序时发送到我们的服务器.然后我可以检查异常数据并修复bug.在一些崩溃中,我有模块名称和抛出异常的函数,这些很容易.但大多数情况下我有这样的事情:
"4 libc++abi.dylib 0x35bba3c5 _ZL19safe_handler_callerPFvvE + 76",
"5 libc++abi.dylib 0x35bba451 _ZdlPv + 0",
"6 libc++abi.dylib 0x35bbb825 __cxa_current_exception_type + 0",
"7 libobjc.A.dylib 0x37bab2a9 objc_exception_rethrow + 12",
"8 CoreFoundation 0x3575a50d CFRunLoopRunSpecific + 404"
Run Code Online (Sandbox Code Playgroud)
例如:
*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array
但是我的应用程序中有几十个数组,所以我需要帮助才能找到引发异常的特定行,使用从堆栈跟踪中获取的数据.
有没有人知道来自Apple或其他的好文章/教程,在那里我可以学习解码堆栈跟踪中的数字以找到源代码中有问题的行.提前致谢!
我想做以下事情:
std::stack <int> s;
int h = 0;
s.push(2);
h = s.pop();
Run Code Online (Sandbox Code Playgroud)
比如h保持价值2.当我尝试我的方法时,我得到"无效的价值,因为它应该是".
这不是.pop()方法的意图吗?这样做的首选方法是什么?
当使用Java的for每种语法时,Stack不对输出的元素使用LIFO排序.请考虑以下代码:
import java.util.Queue;
import java.util.Stack;
import java.util.LinkedList;
public class QueueStackTest {
private static int[] numbers = {1, 2, 3, 4, 5};
public static void main(String[] args) {
Stack<Integer> s = new Stack<Integer>();
Queue<Integer> l = new LinkedList<Integer>();
for (int i : numbers) {
s.push(i);
l.offer(i);
}
System.out.println("Stack: ");
for(Integer i : s) {
System.out.println(i);
}
System.out.println();
System.out.println("Queue:");
for(Integer i : l) {
System.out.println(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Stack:
1
2
3
4
5
Queue:
1
2 …Run Code Online (Sandbox Code Playgroud) stack ×10
c ×2
c# ×2
heap ×2
java ×2
memory ×2
queue ×2
.net ×1
algorithm ×1
c++ ×1
containers ×1
debugging ×1
ios ×1
objective-c ×1
performance ×1
python ×1
ruby ×1
sorting ×1
stackalloc ×1
variables ×1