为什么以下工作并没有抛出某种分段错误?
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
我今天一直在玩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) 我正在使用 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
我最近看到我的一位同事做了类似的事情:
#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)
基本上,他正试图复制两个X和Y到char[]只需一个步骤,告诉内存拷贝读取浮动的两倍.
它绝对有效,通常情况下,我认为这很酷,继续前进.但是由于C++中所有未定义的行为.我想知道这是否能保证始终有效.Y会在X之后立即分配吗?
我正在尝试使用 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 位
我目前的代码是:
a = new int[10];
Run Code Online (Sandbox Code Playgroud)
和地址a是0x...040我希望它是4096字节对齐所以我试图将其更改为:
a = new __declspec(align(4096)) int[10];
Run Code Online (Sandbox Code Playgroud)
但这仍然不起作用(地址仍然以040而不是与... 结束000.我做错了什么?
我想通过使用单个调用来复制类CB中CA类的所有成员以memcpy获得性能原因.
在基本形式中,我认为它是可能的,因为它们都是CPtr只包含指针的类的成员 .
如果不是指针我使用类似boost::shared_ptr或std::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) 我今天接受了采访,并被问到这个问题.如果要求您分配大小为2KB的内存并且分配的内存应该是页面对齐的,那么您将使用什么内核内存分配策略.
KMALLOC处理较小的内存分配策略,但它支持的最低单位是4KB,这是物理页面的大小.我问他,他是否期待平板分配器?他没有积极回答.
linux memory memory-management memory-alignment linux-kernel
我知道结构的大小和对齐方式并不总是一样,但是对整数类型的大小和对齐有什么保证吗?例如,大小和对齐方式是否int始终相同或者它们可能不同?
为了证明我的问题,这个断言会不会失败?
int main() {
assert(_Alignof(int) == sizeof(int));
}
Run Code Online (Sandbox Code Playgroud) 考虑下面的代码及其输出
#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如果不尊重尺寸,为什么要在此处四舍五入?