假设我们有A级
class A;
Run Code Online (Sandbox Code Playgroud)
和这些typedef
typedef void (A::*a_func_ptr)(void);
typedef void (*func_ptr)(void);
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么sizeof(a_func_ptr)返回16,而sizeof(func_ptr)返回4(对于x86系统上的任何指针)?
例如
int main(int argc, char *argv[])
{
int a = sizeof(a_func_ptr);
int b = sizeof(func_ptr);
}
Run Code Online (Sandbox Code Playgroud) 我的心智模型reinterpret_cast一直是,将表达式的位序列视为不同类型,并且cppreference(注意:这不是C++标准中的引用)似乎同意这一点:
不像
static_cast,但是const_cast,reinterpret_cast表达式不会编译到任何CPU指令.它纯粹是一个编译器指令,它指示编译器将表达式的位序列(对象表示)视为具有new_type类型.
寻找保证,我偶然发现[expr.reinterpret.cast]下的一个注释:
[ 注意:由may执行
reinterpret_cast或可能不执行的映射会生成与原始值不同的表示.- 结束说明 ]
这让我想知道:在哪个条件下reinterpret_cast产生的值与对象表示不同于原始值?
我有一个C++库方法,我想从Unity C#脚本调用.
我知道有三个关键步骤.首先,声明C++方法extern "C".二,[DllImport('foobar')]在相应的C#extern方法声明之前使用.第三,使用lib前缀(例如libfoobar.so)命名库文件并将其放在Unity插件文件夹中.
到目前为止一切都那么好 - 如果我只是将简单的参数类型int从C#传递到C++中.但是,要传递byte[]参数,我需要考虑C#和C++处理内存和指针的不同方式.我无法找到一个如何做到这一点的明确例子.
我的问题:如何将byte[]Unity C#脚本传递给外部C++库方法?
所以我正在学习C指针,我有点困惑.指针只指向特定的内存地址.
sizeof(char*),sizeof(int*),sizeof(double*)所有输出8.所以它们都占用8字节来存储内存地址.
但是,如果我尝试编译这样的东西:
int main(void)
{
char letter = 'A';
int *a = &letter;
printf("letter: %c\n", *a);
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器(gcc)的警告:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
int *a = &letter;
Run Code Online (Sandbox Code Playgroud)
但是,char *a = &letter;不会导致警告.
为什么指针的类型很重要,如果它的8字节长呢?为什么声明一个类型不同于它所指向的数据类型的指针会在警告中产生?
所以我在SO和其他地方阅读了很多相关的帖子,例如:
对我来说,在32位系统上,我期望4字节指针,在64位系统上,我期望8字节指针.所以我正在运行这段代码:
int main()
{
cout << "sizeof(int) = " << sizeof(int) << endl;
cout << "sizeof(void*) = " << sizeof(void*) << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是相应的输出:
sizeof(int) = 4
sizeof(void*) = 8
Run Code Online (Sandbox Code Playgroud)
我在Mac OS X 10.6.1上以32位模式运行.这是"uname -a"的输出:
Darwin brent-nashs-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386 i386
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的g ++版本(系统附带的默认版本):
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Run Code Online (Sandbox Code Playgroud)
所以我意识到指针的大小不能保证从系统到系统,并且它们完全依赖于编译器和体系结构,但这种结果是否会使其他人感到不合逻辑呢?这只是Mac OS X 10.6或我的设置的特质吗?还是有一个很好的理由我看到这么大的指针?
==================================================
任何想要他们的人的额外细节......
我最初使用此命令行编译:
g++ -Wall -o TestClass1 TestClass1.cpp
Run Code Online (Sandbox Code Playgroud)
它产生了这个输出:
sizeof(int) = 4
sizeof(void*) …Run Code Online (Sandbox Code Playgroud) 什么是在C++中执行指针运算最干净的方法?我正在尝试将n字节添加到地址.
int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)
之后你可以重铸并以不同的方式使用foo
char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)
这够好吗?现在我理解指针实现dosent保证所有指针(char*,int*)都实现相同的大小.所以不确定是否int*(应该是foo*)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.
没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.
我有一个OpenGL程序,但无法正确分配.
m_VertexData = (GLfloat*)malloc(sizeof(m_TempVertexData));
m_NormalData = (GLfloat*)malloc(sizeof(m_TempNormalData));
NSLog(@"sizeOfTempVertex: %d sizeOfTempNormal: %d", sizeof(m_TempVertexData),sizeof(m_TempNormalData));
NSLog(@"sizeOfVertex: %d sizeOfNormal: %d",sizeof(m_VertexData),sizeof(m_NormalData));
Run Code Online (Sandbox Code Playgroud)
NSLog的:
sizeOfTempVertex:432 sizeOfTempNormal:432
sizeOfVertex:4 sizeOfNormal:4
#include <stdio.h>
int main(void)
{
int *ptr;
printf("The Hex value of ptr is 0x%x",ptr);
printf("The pointer value of ptr is %p",ptr);
}
Run Code Online (Sandbox Code Playgroud)
和输出有些不同,我不知道为什么
The Hex value of ptr is 0x24a77950
The pointer value of ptr is 0x7fff24a77950
Run Code Online (Sandbox Code Playgroud)
它显示ptr的值是一个十六进制整数,但是十六进制输出缺少part 7fff。
这是printf格式问题还是其他?
我是C的新手,我试图说明int/long/short有多少字节.请记住,我必须有变量,所以我不能只说sizeof(int).任何帮助将不胜感激!
#include <stdio.h>
int main()
{
short* A;
int* B;
long* C;
printf("Size of integer variable = %d bytes\n", sizeof(A));
printf("Size of integer variable = %d bytes\n", sizeof(B));
printf("Size of integer variable = %d bytes\n", sizeof(C));
return 0;
}
Run Code Online (Sandbox Code Playgroud)