小编Asi*_*ake的帖子

了解堆栈分配和对齐

我试图理解堆栈对齐是如何工作的,如什么是"堆栈对齐"?但我很难得到一个小例子来证明上述行为.我正在检查我的函数foo的堆栈分配:

void foo() {
    int a = 0;
    char b[16];
    b[0] = 'a';
}
Run Code Online (Sandbox Code Playgroud)

我编译了源文件gcc -ggdb example.c -o example.out(即没有任何编译器标志),并且gdb中的汇编器转储读取:

(gdb) disassemble foo
Dump of assembler code for function foo:
0x08048394 <+0>:    push   %ebp
0x08048395 <+1>:    mov    %esp,%ebp
0x08048397 <+3>:    sub    $0x20,%esp
0x0804839a <+6>:    movl   $0x0,-0x4(%ebp)
0x080483a1 <+13>:   movb   $0x61,-0x14(%ebp)
0x080483a5 <+17>:   leave  
0x080483a6 <+18>:   ret    
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我的堆栈以16字节的块分配(我通过其他几个测试验证了这一点).根据汇编程序转储,这里分配了32个字节,因为(16 <4 + 16 <32),但我希望在前16个字节上分配整数'a',然后在接下来的16个字节上分配字符数组(在中间留下12个字节的空间).但似乎整数和字符数组都被分配了一个20字节的连续块,根据我上面提到的讨论,这是低效的.有人可以解释我在这里缺少的东西吗?

编辑:我得出结论,我的堆栈分配16个字节的块,使用如下程序:

void foo() {
    char a[1];
}
Run Code Online (Sandbox Code Playgroud)

和相应的汇编程序转储:

(gdb) disassemble foo …
Run Code Online (Sandbox Code Playgroud)

c stack memory-management memory-alignment

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

使用多个线程时,Scapy无法嗅探数据包

我将尝试用简化的示例来演示我的问题.

以下是一个非常简单的(单线程)数据包嗅探器(ICMP):

from scapy.all import *

m_iface = "wlan0"
m_dst = "192.168.0.1"

def print_summary(pkt):
  print pkt.summary()

def plain_sniff():
  sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = print_summary)
Run Code Online (Sandbox Code Playgroud)

这个嗅探器工作正常,我得到输出:

WARNING: No route found for IPv6 destination :: (no default route?)
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 / …
Run Code Online (Sandbox Code Playgroud)

python packet-capture scapy

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

Scala案例类和列表

我对Scala完全不熟悉.现在我正在尝试将我在Standard ML中编写的解析器移植到Scala并遇到以下代码的问题:

abstract class Token
case class Zero extends Token
case class At extends Token
//...

object Tokenizer {
  def tokenize(seq : List[Char]) : List[Token] = seq match {
    case List() => error("Empty input")
    case '0' :: rest => Zero :: tokenize(rest)
    case '@' :: rest => At :: tokenize(rest)
    //...
  }  
}
Run Code Online (Sandbox Code Playgroud)

在SML中,我不必声明tokenize()方法的返回类型,但似乎Scala需要它,并且它对我提供的类型不满意(它抱怨Zero,At是无效类型,它们应该是代替Token类型).请注意,我还想在解析阶段稍后的时间点匹配令牌列表.

我在网上和stackoverflow本身做了一些搜索,看看之前是否提出了类似的问题(看起来很简单),但不知怎的,我找不到任何东西.我很确定我有一些基本错误,请随时赐教:)

scala type-inference list case-class

4
推荐指数
2
解决办法
1200
查看次数

是**(a*)*?

快速问题,如果a是正则表达式那么这是真的a* = (a*)*吗?

(a*)*一个有效的表达?如果是,那么任何人都可以解释为什么它是一样的a*?我在这里问道歉,但我找不到谷歌的任何东西.

algorithm regular-language

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

Scala BitSet和移位操作

我正在寻找一种方法来表示一组带有位向量的整数(这将是该整数集的特征函数),并且能够对该集合执行按位运算.

最初我认为scala的BitSet将是理想的候选者.但是,根据文档1,似乎BitSet不支持转换操作.经过进一步调查,我还发现相关的Java BitSet实现不支持移位操作2.

我是否离开了实现我自己的支持移位操作的BitSet类的唯一选择?而且,根据3中给出的描述,听起来难以支持Scala的BitSet实现上的移位操作,或者我在这里误解了什么?

提前致谢.

scala bit-shift bitset

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