小编Gra*_*y S的帖子

编译器(G ++)似乎为类的实例分配了比它需要的更多的内存

我正在学习编译器如何在汇编中表示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个字节呢?

c++ x86 assembly gcc compilation

10
推荐指数
1
解决办法
406
查看次数

有向,未加权图形中的最短路径,在多条最短路径之间有选择标准?

我正在寻找解决最短路径问题的最佳方法:

我有一个带有未加权边缘的有向图.如果存在这样的路径,我需要能够找到任意两个节点之间的最短路径.使这个问题与常规最短路径问题不同的是:如果存在具有最短长度的多个路径,我需要能够选择具有最高"权限"的路径.

每个节点都有一个数字权限,具有最高权限的路径只是具有最高节点权限总和的路径.

总结: 我需要有向图中一对节点之间的最短路径,但如果有多条路径具有相同的最小长度,我需要找到具有最高路径权限的路径.

这样做的最佳方法是什么?有没有办法将其转换为加权图,然后只使用Dijkstra的算法?有没有办法修改广度优先搜索给我一组最短路径,然后我可以迭代查找最高权限路径?

language-agnostic algorithm graph-theory breadth-first-search shortest-path

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