标签: memory-alignment

写出比malloced更多的字符.为什么不失败?

为什么以下工作并没有抛出某种分段错误?

char *path = "/usr/bin/";
char *random = "012";

// path + random + \0
// so its malloc(13), but I get 16 bytes due to memory alignment (im on 32bit)
newPath = (char *) malloc(strlen(path) + strlen(random) + 1);

strcat(newPath, path);
strcat(newPath, "random");
// newPath is now: "/usr/bin/012\0" which makes 13 characters.
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加

strcat(newPath, "RANDOMBUNNIES");
Run Code Online (Sandbox Code Playgroud)

不应该这个调用失败,因为strcat使用的内存多于分配的内存?因此,不应该

free(newPath)
Run Code Online (Sandbox Code Playgroud)

也失败,因为它试图释放16个字节,但我使用了26个字节("/ usr/bin/012RANDOMBUNNIES\0")?

非常感谢你提前!

c memory-management memory-alignment segmentation-fault strcat

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

内存对齐64位

我今天一直在玩C,而且我从来没有机会玩过它,那就是使用一个指向功能的结构......好吧一切顺利,直到我开始得到一些奇怪的bug,当我清理时整个事情(顺便说一下:我在x86_64 arch中编译,在Mac中)看起来和看起来我发现这是结构中的内存对齐node_vtable.

在i386中,它工作得很好......没有任何问题.但是,正如我在x86_64中所说,它不起作用.

/* NOT WORKING */
struct node_vtable {
    void    (*add_node)     (linked_list *, node *);
    node *  (*create_node)  (linked_list *, float, int, int );
    void    (*print)        (linked_list *llist);

};

/* WORKING */
struct node_vtable {
    void    (*print)        (linked_list *llist);
    void    (*add_node)     (linked_list *, node *);
    node *  (*create_node)  (linked_list *, float, int, int );  

};
Run Code Online (Sandbox Code Playgroud)

现在,我修复了将指针移动node * (*create_node) (linked_list *, float, int, int );到结构的末尾,因为它的大小为24字节,这是该结构中最大的.但是,我真的认为有一个更优雅的解决方案,而且我正在寻找一个明确的解释.因此,如果有人可以给出一个提示或一些解释,这将是伟大的;)....因为我的大脑现在真的卡住了:)

整个代码:

#include <stdio.h>
#include <stdlib.h>

struct node {
    int     id;
    int …
Run Code Online (Sandbox Code Playgroud)

c struct memory-alignment

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

使用 mingw32 对 posix_memalign 的未定义引用

我正在使用 Debian Squeeze,使用 mingw32 对 Windows 目标进行交叉编译。

对于 Linux 目标,我可以使用 posix_memalign 来分配对齐的内存。

我似乎无法找到一种方法来让它适用于 Windows 目标;我收到有关未定义引用的错误。我尝试了几种替代功能,但无济于事。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int main(void)
{
    char *foo;

    /* works on linux */
    posix_memalign(&foo, 1024, 1024);

    /* deprecated linux */
    memalign(1024, 1024);
    valloc(1024);

    /* should work on windows only */
    _aligned_malloc(1024, 1024);
}
Run Code Online (Sandbox Code Playgroud)

Linux 目标的示例输出(预期):

ben@debian6400:~/folder$ gcc --version
gcc (Debian 4.4.5-8) 4.4.5

ben@debian6400:~/folder$ gcc -std=c99 test.c
test.c: In function ‘main’:
test.c:11: warning: implicit declaration of function ‘posix_memalign’
test.c:18: warning: implicit declaration …
Run Code Online (Sandbox Code Playgroud)

c memory-management cross-compiling memory-alignment mingw32

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

C++类内存对齐

我最近看到我的一位同事做了类似的事情:

#include <iostream>

class myClass
{
public:
    float X, Y;
    myClass(int x, int y) : X(x), Y(y){}
};

int main()
{
    char buffer[1024] = { 0 };
    myClass example(12, 24);
    memcpy(buffer, &example.X, sizeof(float) * 2); // Is this safe? Will X always be allocated next o Y?
}
Run Code Online (Sandbox Code Playgroud)

基本上,他正试图复制两个XYchar[]只需一个步骤,告诉内存拷贝读取浮动的两倍.

它绝对有效,通常情况下,我认为这很酷,继续前进.但是由于C++中所有未定义的行为.我想知道这是否能保证始终有效.Y会在X之后立即分配吗?

c++ memory-alignment

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

xmm 指令 - 内存源操作数的分段错误

我正在尝试使用 XMM 寄存器使用 SSE2 指令在汇编语言中将 4 个数字添加到其他 4 个数字中。我确实成功了,但我遇到了一些我不明白的事情。如果我以这种方式添加:

movdqu xmm0, oword [var1]
movdqu xmm1, oword [var2]
paddd xmm0, xmm1
movdqu oword [var1], xmm0 
Run Code Online (Sandbox Code Playgroud)

它工作得很好。

但如果我这样尝试:

movdqu xmm0, oword [var1]
paddd xmm0, oword [var2]
movdqu oword [var1], xmm0 
Run Code Online (Sandbox Code Playgroud)

它给了我一个分段错误。

第二种方法有什么问题?我正在使用 Nasm、Intel Atom N270、Linux Mint 12 32 位

x86 assembly sse simd memory-alignment

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

如何在c ++中创建一个对齐的整数数组?

我目前的代码是:

a = new int[10];
Run Code Online (Sandbox Code Playgroud)

和地址a0x...040我希望它是4096字节对齐所以我试图将其更改为:

a = new __declspec(align(4096)) int[10];
Run Code Online (Sandbox Code Playgroud)

但这仍然不起作用(地址仍然以040而不是与... 结束000.我做错了什么?

c++ memory-alignment

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

C++类成员和内存位置

我想通过使用单个调用来复制类CB中CA类的所有成员以memcpy获得性能原因.

在基本形式中,我认为它是可能的,因为它们都是CPtr只包含指针的类的成员 .

如果不是指针我使用类似boost::shared_ptrstd::shared_ptr

这个想法是否有意义,我是否可以获得&a_和&c_的地址,计算偏移量并对memcpy&f_ 做?

 class CBase {
   virtual ~CBase(){}
 };

 class CPtr : public CBase{
   int* p_; // what If I have shared_ptr<int> p_; ?
 };

 class CA {
 public:
    CPtr a_;
    CPtr b_;
    CPtr c_;
 };

 class CB {
 public:
    CPtr e_;
    CPtr f_;
    CPtr g_;
 };
Run Code Online (Sandbox Code Playgroud)

c++ memory-alignment memcpy shared-ptr

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

Linux内核中的内存分配

我今天接受了采访,并被问到这个问题.如果要求您分配大小为2KB的内存并且分配的内存应该是页面对齐的,那么您将使用什么内核内存分配策略.

KMALLOC处理较小的内存分配策略,但它支持的最低单位是4KB,这是物理页面的大小.我问他,他是否期待平板分配器?他没有积极回答.

linux memory memory-management memory-alignment linux-kernel

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

整数类型的对齐方式

我知道结构的大小和对齐方式并不总是一样,但是对整数类型的大小和对齐有什么保证吗?例如,大小和对齐方式是否int始终相同或者它们可能不同?

为了证明我的问题,这个断言会不会失败?

int main() {
    assert(_Alignof(int) == sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

c memory-alignment

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

Sizeof舍入到对齐,但编译器仍将对象放在剩​​余字节中

考虑下面的代码及其输出

#include <cstdint>
#include <iostream>

using std::cout;
using std::endl;

class alignas(8) Something {
    std::uint8_t integer{};
};

int main() {
    auto something = Something{};
    auto character = std::uint8_t{};

    cout << sizeof(something) << endl;
    cout << reinterpret_cast<std::uintptr_t>(&something) << endl;
    cout << reinterpret_cast<std::uintptr_t>(&character) << endl;
}
Run Code Online (Sandbox Code Playgroud)

https://wandbox.org/permlink/m6D0PYWyrGlfjYJP。一次运行的输出

8
140729604143976
140729604143975
Run Code Online (Sandbox Code Playgroud)

如果我有一个对齐到8个字节的结构,则对其进行调用sizeof会将结构的大小四舍五入到其对齐的最接近倍数。但是编译器仍然能够将对象放置在向上取整后剩下的假设空间中。

在什么情况下允许?总是允许吗?sizeof如果不尊重尺寸,为什么要在此处四舍五入?

c++ struct memory-alignment c++17

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