系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.
我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?
我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).
如果我有一个课程如下
class Example_Class
{
private:
int x;
int y;
public:
Example_Class()
{
x = 8;
y = 9;
}
~Example_Class()
{ }
};
Run Code Online (Sandbox Code Playgroud)
结构如下
struct
{
int x;
int y;
} example_struct;
Run Code Online (Sandbox Code Playgroud)
记忆中的结构是否 example_struct与其相似Example_Class
例如,如果我执行以下操作
struct example_struct foo_struct;
Example_Class foo_class = Example_Class();
memcpy(&foo_struct, &foo_class, sizeof(foo_struct));
Run Code Online (Sandbox Code Playgroud)
将foo_struct.x = 8和foo_struct.y = 9(即:与foo_class中的x,y值相同的值)?
我问的原因是我有一个C++库(不想改变它),它与C代码共享一个对象,我想用一个结构来表示来自C++库的对象.我只对对象的属性感兴趣.
我知道理想的情况是将Example_class包装在C和C++代码之间的公共结构中,但是更改正在使用的C++库并不容易.
我已经看到以下两种在C API中声明不透明类型的样式.使用一种风格而不是另一种风格有明显的优势吗?
// foo.h
typedef struct foo * fooRef;
void doStuff(fooRef f);
// foo.c
struct foo {
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
// foo.h
typedef struct _foo foo;
void doStuff(foo *f);
// foo.c
struct _foo {
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud) 除其他事项外,C11还增加了"匿名结构和联盟".
我四处寻找,但无法找到匿名结构和工会何时有用的明确解释.我问,因为我不完全明白它们是什么.我得知它们之后是没有名字的结构或联合,但我总是(必须?)将其视为一个错误,所以我只能设想一个用于命名结构的用法.
我环顾四周,但一直无法找到解决问题的问题.这是我的代码:
#include <stdlib.h>
struct my_struct {
int n;
char s[]
};
int main()
{
struct my_struct ms;
ms.s = malloc(sizeof(char*)*50);
}
Run Code Online (Sandbox Code Playgroud)
这里是错误gcc给我的:错误:无效使用灵活的数组成员
如果我在结构中声明s的声明,我可以编译它
char* s
Run Code Online (Sandbox Code Playgroud)
这可能是一个优秀的实现(指针算法比数组快,是吗?)但我想在ca声明中
char s[]
Run Code Online (Sandbox Code Playgroud)
是相同的
char* s
Run Code Online (Sandbox Code Playgroud) 我试图了解如何以最干净/最安全的方式解决C中的这个微不足道的问题.这是我的例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
typedef struct
{
char name[20];
char surname[20];
int unsigned age;
} person;
//Here i can pass strings as values...how does it works?
person p = {"John", "Doe",30};
printf("Name: %s; Age: %d\n",p.name,p.age);
// This works as expected...
p.age = 25;
//...but the same approach doesn't work with a string
p.name = "Jane";
printf("Name: %s; Age: %d\n",p.name,p.age);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
编译器的错误是:
main.c:在函数'main'中:main.c:18:错误:从类型'char*'分配类型'char [20]'时出现不兼容的类型
我知道C(不是C++)没有字符串类型而是使用字符数组,所以另一种方法是更改示例结构以保存字符指针:
#include <stdio.h>
int main(int argc, char *argv[])
{
typedef …Run Code Online (Sandbox Code Playgroud) 首先,我想说,我知道在SO中有很多文章和问题引用了indirectSwift中的关键字.
最常用的解释indirect是允许递归枚举.
indirect我想知道它是如何允许我们使用递归枚举的,而不是只知道允许我们做什么.
是因为枚举是值类型,如果它们是以递归结构构建的,那么值类型不能很好地扩展?为什么?
indirect修改值类型行为是否更像行为类型?
以下两个例子编译得很好.有什么不同?
indirect enum BinaryTree<T> {
case node(BinaryTree<T>, T, BinaryTree<T>)
case empty
}
enum BinaryTree<T> {
indirect case node(BinaryTree<T>, T, BinaryTree<T>)
case empty
}
Run Code Online (Sandbox Code Playgroud) 如何尽可能清楚地初始化const/static数组结构?
class SomeClass
{
struct MyStruct
{
public string label;
public int id;
};
const MyStruct[] MyArray = {
{"a", 1}
{"b", 5}
{"q", 29}
};
};
Run Code Online (Sandbox Code Playgroud) 考虑以下C代码:
#include <stdio.h>
struct employee
{
int id;
char name[30];
};
int main()
{
struct employee e1;
printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
return(0);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
4 30 36
为什么结构的大小不等于其各个组件变量的大小总和?
在System.Data.Linq中,EntitySet<T>使用几个ItemList<T>结构,如下所示:
internal struct ItemList<T> where T : class
{
private T[] items;
private int count;
...(methods)...
}
Run Code Online (Sandbox Code Playgroud)
(花了我比它应该发现的更长的时间 - 无法理解为什么实体字段EntitySet<T>没有抛出空引用异常!)
我的问题是,将它作为一个类的结构实现它有什么好处?