对于其clas(子)具有单继承的对象,通常需要多少个vptrs,其基类为多个继承base1和base2.确定对象提供了多少个vpt的策略是什么,它提供了几个单继承和多继承.虽然标准没有指定vptrs,但我只是想知道一个实现如何实现虚函数.
是的,已经存在相当多的类似问题(5037601,19166698,4855162,14505995,5052648,13409508,7745146,7459630;对不起,没有足够的代表超过2个链接),是的,有一些很好的文章解释这种东西(点击,点击,http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html).我已经阅读了它们,我认为我得到了一般的想法,但我仍然失败,成功地利用了我能想到的最简单的训练玩具示例.
#include <stdio.h>
void f(char* a)
{
    printf("a: %p\n", &a);
    printf(a);
    return;
}
void main(int argc, char** argv)
{
    f(argv[1]); //please ignore the lack of any check
    return;
}
是的,堆栈是可执行的,是的,内存布局随机化被禁用.每次执行都给我相同的地址a.我可以提供它,例如$ ruby -e 'print "AAAA"+("%08x."*16)',这导致:
a: 0xbfffece0
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838.
所以现在我可以看到我的输入最终在内存中.我可以用栈写一个值$ ruby -e 'print "12345%n"+("%08x."*16)',结果如下:
a: 0xbfffece0
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78.
显然,我的最终目标可能是这样的<something><NOPs><shellcode>,其中<something>覆盖了返回地址,f以便程序将跳转到NOP底座并执行shellcode.但保存的返回地址的地址现在似乎取决于我的输入,对吧?类似的东西0xbfffece0 - len(input) - 12,假设一个12字节的序幕?也许这个例子毕竟不是最简单的......
我很困惑.有任何想法吗?
我试图理解C中的堆栈帧,所以我写了一个简单的C代码来分析堆栈帧.
首先,fun1()返回一个局部变量的地址,该地址变量被初始化为10到ptr,这会导致警告但是没关系...如果我打印*ptr的值现在它打印10,即使这很好.. .
接下来fun2()返回一个甚至没有初始化的局部变量的地址,如果我尝试打印*ptr的值,现在它打印10,无论我是否返回a或b的地址...
为了理解这里发生了什么,我使用了gdb.使用gdb,我开始一步一步调试,当我到达fun2()中的" return&a " 行时,我试图打印b的地址,打印&b但是打印 不能取"b"的地址不是一个左值.
我不明白,当我尝试打印a的地址,打印和打印绝对精细,然后为什么不b的地址.*为什么a不是一个左值?
# include <stdio.h>
int * fun1() {
    int a = 10; 
    return &a; 
}
int * fun2()
{
    int a;
    int b;
    return &a;           // return &b;
}
int main ()  
{
    int *ptr;
    ptr = fun1();
    ptr = fun2();
    printf ("*ptr = %d, fun2() called...\n", *ptr);
    return 0;
}
这是在Java 6内存模型之后.在32位JVM中,对象的浅大小是
8 bytes (object header) + total of all instance variables + padding (optional)
如果前两个术语没有加到8的倍数,则会有填充.
在64位JVM中,Shallow大小为
16 bytes (object header) + total of all instance variables + padding (optional)
我的理解是这个Object头由2个单词组成(oracle hotspot VM)
在32位JVM上,对象头= 2*32位= 64位= 
64位JVM上的8个字节,对象头= 2*64位= 128位= 16个字节
但使用CompressedOops,3低阶位被截断,因此应回8个字节在64位JVM对堆小于32场音乐会
但是当我使用JOL(Java对象布局)测试对象布局时,它显示了12个字节的Object头.
测试代码
public class App  {
    public static void main( String[] args )
    {
        System.out.println(System.getProperty("java.version"));
        System.out.println(VMSupport.vmDetails());
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
    } 
}
class A {
   int a; 
}
产量
1.8.0_05
Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift. …该标准定义了两种类型的布局兼容性.但是,我没有看到标准中的任何地方,当两种类型的布局兼容时后果是什么.似乎布局兼容是一种在任何地方都不使用的定义.
布局兼容的目的是什么?
注意:据说,它可能意味着类型具有相同的布局(offsetof对于每个相应的成员是相同的),因此,例如,对于简单的可复制类型,可以在它们之间复制基础字节.但是我没有在标准中看到这样的东西.
在这里查看此问题的C版本。
当存在填充位时,我有两个关于位字段的问题。
说我有一个结构定义为
struct T { 
    unsigned int x: 1; 
    unsigned int y: 1;
};
结构T仅实际使用了两位。
问题1:这两位始终是基础无符号int的最低有效位吗?还是取决于平台?
问题2:那些未使用的30位是否总是初始化为0?C ++标准对此有何评论?
所以我正在使用Olly调试器,嗅探我能找到的关于Windows的内容,然后按下M按钮,它弹出了内存映射窗口.所以我搜索了一些关于这个主题的文章,我发现我实际上可以写到64K以上的地址,我试过并且很好..为什么它不起作用.关于那些较低的2GB空间:
为什么会出现这些差距?例如,有0x10000-0x1FFFF R/Wable空间然后没有128K,然后是一些可读空间.我的意思是这已经被正确分页了,所以在物理空间中是否存在过去的事情并不重要(不要提到0x20000-0x40000应该完全没有r/w),为什么有人决定不如此随机使用一些地址空间?很可能我只是感到困惑,因为在olly调试器的内存映射中,很多行都是空的,其中列是'Contains'.是否可能有一些参考我可以从olly反对这个内存映射,并找出什么空间有什么目的,因此是或不是这样的分页?
假设我真的不想搞任何关于内存管理的问题,是否可以使用较低内存而不是使用堆来编写Windows程序,或者我是否会遇到一些问题?
感谢您阅读此问题.
编辑
我正在尝试在 Fortran 中编写一些代码,这需要重新排序 n 维数组。我认为重塑内在与order参数应该允许这样做,但是我遇到了困难。
考虑以下最小示例
program test
    implicit none
    real, dimension(:,:,:,:,:), allocatable :: matA, matB
    integer, parameter :: n1=3, n2=5, n3=7, n4=11, n5=13
    integer :: i1, i2, i3, i4, i5
    allocate(matA(n1,n2,n3,n4,n5)) !Source array
    allocate(matB(n3,n2,n4,n1,n5)) !Reshaped array
    !Populate matA
    do i5=1, n5
       do i4=1, n4
          do i3=1, n3
             do i2=1, n2
                do i1=1, n1
                   matA(i1,i2,i3,i4,i5) = i1+i2*10+i3*100+i4*10000+i5*1000000
                enddo
             enddo
          enddo
       enddo
    enddo
    print*,"Ad1 : ",matA(:,1,1,1,1),shape(matA)
    matB = reshape(matA, shape(matB), order = [3,2,4,1,5])
    print*,"Bd4 : ",matB(1,1,1,:,1),shape(matB) !Leading …fortran transpose memory-layout multidimensional-array reshape
For reference, in C/C++, the equivalent (sizeof operator) is compile time, and can be used with template programming (Generics).
I was looking through Swift Algorithms Club for implementations of common data structures and came across their implementation of a Bit Set:
public struct BitSet {
  private(set) public var size: Int
  private let N = 64
  public typealias Word = UInt64
  fileprivate(set) public var words: [Word]
  public init(size: Int) {
    precondition(size > 0)
    self.size = size
    // Round up the …MemoryLayout 如何计算结构体的大小?
我读了这篇文章,我似乎理解得很好,直到我陷入了以下问题:
struct CertifiedPuppy1 {
  let age: Int
  let isTrained: Bool
  let isCertified: Bool
}
MemoryLayout<CertifiedPuppy1>.size        // 10
MemoryLayout<CertifiedPuppy1>.stride      // 16
MemoryLayout<CertifiedPuppy1>.alignment   // 8
struct CertifiedPuppy2 {
  let isTrained: Bool
  let age: Int
  let isCertified: Bool
}
MemoryLayout<CertifiedPuppy2>.size        // 17
MemoryLayout<CertifiedPuppy2>.stride      // 24
MemoryLayout<CertifiedPuppy2>.alignment   // 8
struct CertifiedPuppy3 {
  let isTrained: Bool
  let isCertified: Bool
  let age: Int
}
MemoryLayout<CertifiedPuppy3>.size        // 16 <--why not 10, like for CertifiedPuppy1 ??--
MemoryLayout<CertifiedPuppy3>.stride      // 16
MemoryLayout<CertifiedPuppy3>.alignment   // 8
问题是,为什么CertifiedPuppy3 …