我正在学习编译器如何在汇编中表示C++程序.我有一个关于编译器做的事情的问题,我无法理解.这是一些C++代码:
class Class1 {
public:
int i;
char ch;
};
int main() {
Class1 cls;
}
Run Code Online (Sandbox Code Playgroud)
使用"g ++ -S"进行编译输出(我已经删除了除函数定义之外的所有内容):
main:
push ebp
mov ebp, esp
sub esp, 16
mov eax, 0
leave
ret
Run Code Online (Sandbox Code Playgroud)
我不明白这条线sub esp, 16.为什么它会为此类的实例分配16个字节,当您考虑数据结构对齐和填充时,只需要8个字节?
它应该是
[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]
Run Code Online (Sandbox Code Playgroud)
不应该吗?
当我用类定义编译代码时也包括一个double,即
class Class1 {
public:
int i;
char ch;
double dub;
};
Run Code Online (Sandbox Code Playgroud)
它仍然分配了16个字节,这在这种情况下是有意义的.
那么为什么编译器在需要8个字节时会分配16个字节呢?
我正在寻找解决最短路径问题的最佳方法:
我有一个带有未加权边缘的有向图.如果存在这样的路径,我需要能够找到任意两个节点之间的最短路径.使这个问题与常规最短路径问题不同的是:如果存在具有最短长度的多个路径,我需要能够选择具有最高"权限"的路径.
每个节点都有一个数字权限,具有最高权限的路径只是具有最高节点权限总和的路径.
总结: 我需要有向图中一对节点之间的最短路径,但如果有多条路径具有相同的最小长度,我需要找到具有最高路径权限的路径.
这样做的最佳方法是什么?有没有办法将其转换为加权图,然后只使用Dijkstra的算法?有没有办法修改广度优先搜索给我一组最短路径,然后我可以迭代查找最高权限路径?
language-agnostic algorithm graph-theory breadth-first-search shortest-path